Python进程在IO完成之前终止

时间:2015-10-14 14:31:52

标签: python multithreading io multiprocessing

我正在使用python多处理库来处理一组进程中的信息。这些过程还包含进一步划分必须完成的工作量的过程。只有一个Manager.Queue可以累积消耗数据的所有进程的结果。

在python脚本的主线程中。我试图使用连接来阻止主线程,直到我们可以合理地确定是否所有子进程都已完成然后将输出写入单个文件。但是,在将所有数据写入文件之前,系统将终止并关闭文件。

以下代码是对上述解决方案的实现的简化提取。 for inQueues队列:         queue.join()

{{1}}

out_queue.qsize()将打印超过500条可用记录,但只有100条记录将被打印到文件中。 此时,如果500条记录是系统生成的总数,而且只是此时报告的数字,我不是100%确定。

如何确保将所有结果写入results.csv文件?

1 个答案:

答案 0 :(得分:0)

在使用数据之前不要等待所有进程完成,而是同时处理数据并记住哪些进程仍在运行:

processes = []

"""start processes and append them to processes"""

while True:
    try:
        # get an item
        item = queue.get(True, 0.5)
    except Queue.Empty:
        # no item received in half a second
        if not processes:
            # there are no more processes and nothing left to process
            break
        else:
            proc_num = 0
            while proc_num < len(processes):
                process = processes[proc_num]
                exit_code = process.poll()
                if exit_code is None:
                    # process is still running, proceed to next
                    proc_num += 1
                elif exit_code == 0:
                    # process ended gracefully, remove it from list
                    processes.pop(proc_num)
                else:
                    # process ended with an error, what now?
                    raise Exception('Her last words were: "%r"' % exit_code)
    else:
        # got an item
        """process item"""

请勿在{{1​​}}案例之外测试processes是否为空,否则您将races

但是你可能会对higher level function

感到高兴
Queue.Empty