如果我想给进程池更多的工作,我可以在Pool.close()之前调用Pool.join()?

2024-06-16 09:29:30 发布

您现在位置:Python中文网/ 问答频道 /正文

有关multiprocessing{a1}的文档包括以下关于Pool.join()的内容:

Wait for the worker processes to exit. One must call close() or terminate() before using join().

我知道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()


Tags: tomapforcloseherea1needmultiprocessing
3条回答

So, why can I not call Pool.join() before Pool.close()

因为^{}等待工人退出。不仅要完成任务,还要真正退出。如果你没有事先打电话给close(),那么就没有人告诉工人们退出,他们处于待命状态,准备接受进一步的任务

因此,对join()的调用之前没有对close()的调用,只会挂起-join()将永远等待工人退出,这是没有人告诉他们的。因此,如果yopu试图这样做,Python将引发ValueError("pool is still running")错误

正如大卫·施瓦茨所指出的,不要调用join()来“同步”——这不符合这个目的

只需重新使用池,而无需对其调用任何特殊函数。要继续将作业发送到池中,您无需执行任何特殊操作。如果你还没有完全完成它,就让它自己去做,让它继续做它的事情

在本例中,您不需要在map()之后调用join(),因为map()调用,直到所有结果都完成。但是您可以使用map_async(),它不阻止

close()terminate()之前调用join()不正确。因为join()是一个阻塞调用,并等待工作进程退出。因此,您不能在join()之后重用池

相关问题 更多 >