Python 3.6.8-多处理.Pool.apply_async()不工作



看起来apply_async不工作,什么也没发生。不确定这里出了什么问题。我正在使用MacOS catalina

import time
from multiprocessing import Pool
def worker(sl):
print(sl)
time.sleep(sl)
return sl
if __name__ == '__main__':
with Pool(processes=3) as pool:
for i in range(5,30,5):
result = pool.apply_async(func=worker,args=(i,))

当您调用pool.apply_async时,您正在安排要运行的任务。该调用的返回值是对其调用方法getmultiprocessing.pool.AsyncResult实例,该实例将阻塞直到任务完成,并将从apply_async方法调用中指定的辅助函数返回返回值。但是您尚未在这些AsyncResult实例中的任何一个实例上调用get(或wait(。相反,您让自己立即陷入with Pool(processes=3) as pool:块的末尾,这就是您的问题所在。

文件不是很明确。然而,有这样的警告:

警告:multiprocessing.pool对象的内部资源需要通过将池用作上下文管理器或手动调用close()terminate()来正确管理(与任何其他资源一样(。如果不这样做,可能会导致进程挂起。

由于with语句,您正在使用池作为上下文管理器,实际发生的情况是,在with块完成时,会调用pool.terminate()。因此,池中的所有进程在有机会运行您提交的任何任务之前都会立即终止。

由于您对worker的实际返回值不感兴趣,保存AsyncResult对象并对其调用get的另一种选择是在退出with块之前先调用pool.close(),然后调用pool.join(),这将等待所有提交的任务完成:

close()阻止向池中提交更多任务。完成所有任务后,工作进程将退出。

join()等待工作进程退出。在使用join()之前,必须调用close()terminate()

import time
from multiprocessing import Pool
def worker(sl):
print(sl)
time.sleep(sl)
return sl
if __name__ == '__main__':
with Pool(processes=3) as pool:
for i in range(5,30,5):
result = pool.apply_async(func=worker,args=(i,))
pool.close()
pool.join()

打印:

5
10
15
20
25

相关内容

  • 没有找到相关文章

最新更新