我有一个脚本,真实成功做了多处理池组任务与imap_unordered()
电话:显示Python多处理池地图调用的进度?
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
但是,我num_tasks
约为250,000,所以join()
锁定10秒左右的主线程,我希望能够递增地回显命令行以显示主进程未被锁定。例如:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
while (True):
remaining = rs.tasks_remaining() # How many of the map call haven't been done yet?
if (remaining == 0): break # Jump out of while loop
print "Waiting for", remaining, "tasks to complete..."
time.sleep(2)
是否有结果对象或池本身的方法,指示剩余任务的数量?我尝试使用multiprocessing.Value
对象作为计数器(do_work
在完成其任务后调用counter.value += 1
操作),但计数器只有在停止递增之前达到总值的85%。
我只在代码退出后才看到打印输出(不是每次迭代)。你有什么建议吗? – 2014-11-06 10:47:36
@HananShteingart:在我的系统(Ubuntu)上,Python 2和Python 3都可以正常工作。我以'def do_word(* a):time.sleep(.1)'为例。如果它不适合你,然后创建一个[完整的最小代码示例](http://stackoverflow.com/help/mcve),它演示了你的问题:使用文字描述你期望发生的事情和发生的事情,提及你如何运行你的Python脚本,你的操作系统,Python版本以及[作为新问题发布](http://tinyurl.com/stack-hints)。 – jfs 2014-12-01 17:13:26
我遇到了与@HananShteingart相同的问题:这是因为我试图使用'Pool.map()'。我没有意识到_only_'imap()'和'imap_unordered()'以这种方式工作 - 文档只是说“一个lazier版本的map()”,但实际上意味着“底层迭代器返回结果” 。 – simonmacmullen 2015-03-24 16:01:12