看起来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
时,您正在安排要运行的任务。该调用的返回值是对其调用方法get
的multiprocessing.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