Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在不关闭池或使用map()的情况下等待多处理池中的进程完成_Python_Multiprocessing - Fatal编程技术网

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只是一个非常小的对象,它不会花费你很多钱。