Python在不关闭池或使用map()的情况下等待多处理池中的进程完成
我有一个代码块,如下所示Python在不关闭池或使用map()的情况下等待多处理池中的进程完成,python,multiprocessing,Python,Multiprocessing,我有一个代码块,如下所示 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 fin
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)
基本上我有两个循环。我在循环外部初始化进程池一次,以避免过热。在第二个循环的末尾,我想总结一下所有过程的结果
问题是,由于数据输入的变化,我无法使用pool.map等待。我也不能使用pool.join和pool.close,因为我仍然需要在第1个循环的下一个迭代中使用该池
在这种情况下,等待进程完成的好方法是什么
我尝试检查池。在第二个循环结束时检查缓存
while len(process_pool._cache) > 0:
sleep(0.001)
这种方式有效,但看起来很奇怪。有更好的方法吗?apply\u async将返回一个AsyncResult对象。此对象有一个等待[超时]方法,您可以使用它
例如:
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)
我没有检查这段代码,因为它不是可执行的,但它应该可以工作。apply\u async将返回一个AsyncResult对象。此对象有一个等待[超时]方法,您可以使用它
例如:
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)
我没有检查这段代码,因为它不是可执行的,但它应该可以工作。或者,您可以使用回调来记录您收到的退货数量 池=多处理。池10 对于range300中的i: 结果=0 对于500范围内的m: 数据=做一些计算资源 结果=pool.apply\u asyncparalized\u func,data,call\u back=lambda x:results+=1; 结果 需要等待所有进程完成 结果<500时: 通过 总结资源 用资源做点什么
或者,您可以使用回调来记录您得到的回报数量 池=多处理。池10 对于range300中的i: 结果=0 对于500范围内的m: 数据=做一些计算资源 结果=pool.apply\u asyncparalized\u func,data,call\u back=lambda x:results+=1; 结果 需要等待所有进程完成 结果<500时: 通过 总结资源 用资源做点什么
对我想到了这个。但我担心在数组中累积结果时会消耗大量内存。在实际代码中,第二个循环的范围很大,您不必担心。首先,AsyncResult将隐式存储在池中,因此不会节省任何空间。第二,AsyncResult只是一个非常小的对象,它不会花费你很多。我想到了这个。但我担心在数组中累积结果时会消耗大量内存。在实际代码中,第二个循环的范围很大,您不必担心。首先,AsyncResult将隐式存储在池中,因此不会节省任何空间。其次,AsyncResult只是一个非常小的对象,它不会花费你很多钱。