每小时创建一次multiprocessing.Pool池

时间:2016-10-11 22:06:48

标签: python multiprocessing

我有一个遵循以下逻辑的程序:

在每小时开始时,多个目录会收到一个连续输入数据的文件。我正在开发一个简单的程序,它可以同时读取所有文件并将拖尾/读取部分抽象为一个函数,现在我们称之为“尾部”。提供数据的外部程序并不总能顺利运行。有时文件会迟到,有时下一个小时会出现,程序仍会提供过时的文件数据。我不能丢失数据。我的解决方案看起来像这样使用multiprocessing.pool在其中的部分使用伪代码:

def process_data(logfile):
    num_retries = 5
    while num_retries > 0:
        if os.path.isfile(logfile):
            for record in tail(logfile):
                do_something(record)
        else:
            num_retries -= 1
        time.sleep(30)

def tail(logfile):
    logfile = open(logfile, 'r')
    logfile.seek(0, 2)
    while True:
        line = logfile.readline()
        if line:
            wait_time = 0
            yield line
        else:
            if wait_time >= 360:
                break
            wait_time += 1
            time.sleep(1)
            continue

if __name__ == '__main__':

    start_time = sys.argv[1]
    next_hour = None

    while True:
        logdirs = glob.glob("/opt/logs/plog*")

        current_date = datetime.now()
        current_hour = current_date.strftime('%H')
        current_format = datetime.now().strftime("%Y%m%d%H")

        logfiles = [logdir + '/some/custom/path/tofile.log' for logdir in logdirs]

        if not next_hour:
            next_hour = current_date + timedelta(hours=1)


        if current_hour == next_hour.strftime('%H') or current_hour == start_time:
            start_time = None
            pool = multiprocessing.Pool()
            pool.map(process_data, logfiles)
            pool.close()
            pool.join()

        next_hour = current_date + timedelta(hours=1)
        time.sleep(30)

这是我在进程级别实现日志记录时所观察到的内容:

  • 每个目录中的所有文件都已正确阅读
  • 当下一个小时点击时,在下一组文件被读取之前会有360秒(6分钟)的延迟
  • 因此,如果小时4结束,则在第4小时完成
  • 的过程之前,不会在第5小时创建新池

我正在寻找:我想继续使用多处理,但无法弄清楚为什么主while循环中的代码在前一个进程池完成之前不会通过。我已经尝试了没有多处理的其他示例的每小时逻辑,并且它已经运行良好。我认为这与Pool类有关,并希望得到如何制作它的建议,以便即使在前一个Pool处于活动状态时,我也可以为新的小时创建一个新池并开始处理新文件即使这意味着这会产生大量的过程。

0 个答案:

没有答案