Python等待多处理池中的进程完成而无需关闭池或使用map()

时间:2018-02-08 07:39:33

标签: 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 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)

这种方式有效,但看起来很奇怪。有更好的方法吗?

2 个答案:

答案 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)