有关multiprocessing
{a1}的文档包括以下关于Pool.join()
的内容:
Wait for the worker processes to exit. One must call
close()
orterminate()
before usingjoin()
.
我知道Pool.close()
会阻止任何其他任务提交到池中;并且Pool.join()
在继续父进程之前等待池完成
那么,如果我想重用我的池来执行多个任务,然后在很久以后调用它,为什么我不能在Pool.close()
之前调用Pool.join()
?例如:
pool = Pool()
pool.map(do1)
pool.join() # need to wait here for synchronization
.
.
.
pool.map(do2)
pool.join() # need to wait here again for synchronization
.
.
.
pool.map(do3)
pool.join() # need to wait here again for synchronization
pool.close()
# program ends
为什么在使用join()
之前必须一次“调用close()
或terminate()
”
因为^{} 等待工人退出。不仅要完成任务,还要真正退出。如果你没有事先打电话给
close()
,那么就没有人告诉工人们退出,他们处于待命状态,准备接受进一步的任务因此,对
join()
的调用之前没有对close()
的调用,只会挂起-join()
将永远等待工人退出,这是没有人告诉他们的。因此,如果yopu试图这样做,Python将引发ValueError("pool is still running")
错误正如大卫·施瓦茨所指出的,不要调用
join()
来“同步”——这不符合这个目的只需重新使用池,而无需对其调用任何特殊函数。要继续将作业发送到池中,您无需执行任何特殊操作。如果你还没有完全完成它,就让它自己去做,让它继续做它的事情
在本例中,您不需要在
map()
之后调用join()
,因为map()
调用块,直到所有结果都完成。但是您可以使用map_async()
,它不阻止在
close()
或terminate()
之前调用join()
不正确。因为join()
是一个阻塞调用,并等待工作进程退出。因此,您不能在join()
之后重用池相关问题 更多 >
编程相关推荐