定期在循环内输出统计信息

时间:2015-03-22 21:46:37

标签: python

我有一个使用daemon.runner不断运行的程序。它不断处理来自stdin的数据,并使用syslog作为输出。

代码如下:

class App():
  lines = 0

  def __init__(self):
    # Config

  def run(self):
    while True:
      with open(PIPE_NAME) as pipe:
        for line in pipe:
          # Do stuff
          self.lines = self.lines + 1

      # Reopen pipe if required (or die if it's unavailable)

我想定期输出统计信息,例如每15分钟输出一次。我可以检查每次处理一行时的时间,但是传入的数据项之间偶尔会有很大的间隙。

以固定的时间间隔定期从此示例中输出self.lines的方法是什么?

2 个答案:

答案 0 :(得分:1)

每次迭代,检查自上次打印后是否已经过去15分钟。如果是,请打印并记录上次打印时间。

使用select循环确保至少在每个打印间隔检查时间(基本上是“超时读取”):

import os
import select
import time

PRINT_INTERVAL = 15*60  # sec

def run():
    with open(PIPE_NAME) as pipe:
        last_print = 0
        while True:
            timeout = PRINT_INTERVAL - (time.time() - last_print)
            r,w,e = select.select([pipe], [], [], timeout)

            if pipe in r:
                # pipe is ready for reading
                handle_pipe(pipe)

            if (time.time() - last_print) > PRINT_INTERVAL:
                last_print = time.time()
                print_statistics()

def handle_pipe(pipe):
    for line in pipe:
       # Do stuff...

def print_statistics():
    print 'Statistics...'

答案 1 :(得分:0)

您可以使用多线程:

import threading
import time

class App():
    lines = 0

    def __init__(self):
        # Config

    def run(self):
        myTimer = threading.Thread(target = self.timer)
        myTimer.start()

        while True:
            with open(PIPE_NAME) as pipe:
                for line in pipe:
                    # Do stuff
                    self.lines = self.lines + 1

            # Reopen pipe if required (or die if it's unavailable)

    def timer(self):
        start = time.time()
        while True:
            if time.time() - start > 900: # should be 15 minutes
                break

        print(self.lines)
        timer()
  

多线程是指程序或操作系统一次为多个用户提供服务并管理多个同时请求的能力,而无需在计算机中运行多个程序副本

这个解决方案很快,不需要等待任何事情,它只是完成它的工作而没有别的。我已经对此进行了一些测试,但是如果有任何问题,那就说吧。我真的希望这会有所帮助。 :)