【发布时间】:2016-01-12 17:05:09
【问题描述】:
我正在使用 python 多处理库来处理一组进程中的信息。这些流程还包含进一步划分必须完成的工作量的流程。有一个 Manager.Queue 用于累积所有使用数据的进程的结果。
在python脚本的主线程中。我尝试使用连接来阻塞主线程,直到我们可以合理地确定是否所有子进程都已完成,然后将输出写入单个文件。然而,在所有数据写入文件之前,系统终止并且文件关闭。
以下代码是上述解决方案的实现的简化提取。 对于 inQueues 中的队列: queue.join()
for p in processes:
p.join()
print "At the end output has: " + str(out_queue.qsize()) + " records"
with open("results.csv", "w") as out_file:
out_file.write("Algorithm,result\n")
while not out_queue.empty():
res = out_queue.get()
out_file.write(res['algorithm'] + ","+res['result']+"\n")
out_queue.task_done()
time.sleep(0.05)
out_queue.join()
out_file.close()
out_queue.qsize() 将打印超过 500 条可用记录,但仅将 100 条打印到文件中。 同样在这一点上,我不能 100% 确定系统是否总共生成了 500 条记录,而只是此时报告的数量。
如何确保将所有结果写入 results.csv 文件?
【问题讨论】:
-
qsize(): "返回队列的大概大小。由于多线程/多处理语义,这个数字不可靠。"
-
我知道 qsize 方法指示的队列大小可以更改,但是代码部分是整个程序中唯一从队列中删除的部分,因此不需要打印的记录数将小于队列的大小(这是当前发生的情况)。
标签: python multithreading io multiprocessing