我有一个如下代码
pool = multiprocessing.Pool(10)
for i in range(300):
for m in range(500):
data = do_some_calculation(resource)
pool.apply_async(paralized_func, data, call_back=update_resource)
# need to wait for all processes finish
# {...}
# Summarize resource
do_something_with_resource(resource)
所以基本上我有2个循环。我在循环外部初始化进程池以避免过热。在第二个循环结束时,我想总结所有过程的结果。
问题是由于pool.map()
输入的变化,我无法使用data
等待。我无法使用pool.join()
和pool.close()
因为我仍然需要在第一次循环的下一次迭代中使用pool
。
在这种情况下,等待进程完成的好方法是什么?
我尝试在第二次循环结束时检查pool._cache。
while len(process_pool._cache) > 0:
sleep(0.001)
这种方式有效,但看起来很奇怪。有更好的方法吗?
答案 0 :(得分:2)
wait([timeout])
将返回pool = multiprocessing.Pool(10)
for i in range(300):
results = []
for m in range(500):
data = do_some_calculation(resource)
result = pool.apply_async(paralized_func, data, call_back=update_resource)
results.append(result)
[result.wait() for result in results]
# need to wait for all processes finish
# {...}
# Summarize resource
do_something_with_resource(resource)
个对象。该对象有一个方法{{1}},您可以使用它。
示例:
{{1}}
我还没有检查过这段代码,因为它不可执行,但它应该有效。
答案 1 :(得分:0)
或者您可以使用回调来记录您获得了多少回报。
pool = multiprocessing.Pool(10)
for i in range(300):
results = 0
for m in range(500):
data = do_some_calculation(resource)
result = pool.apply_async(paralized_func, data, call_back=lambda x: results+=1; )
results.append(result)
# need to wait for all processes finish
while results < 500:
pass
# Summarize resource
do_something_with_resource(resource)