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

agd*_*ruv 12 python multithreading multiprocessing

的文档multiprocessing 说明了以下内容Pool.join()

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

我知道这会Pool.close()阻止任何其他任务提交到池中;并且Pool.join()在继续父进程之前等待池完成。

那么,如果我想重用我的池来执行多个任务,然后在很久以后才最终调用,为什么我不能Pool.join()在之前调用呢?例如:Pool.close()close()

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
Run Code Online (Sandbox Code Playgroud)

为什么一定要“调用close()terminate()使用前join()”?

use*_*342 6

Pool.join()那么,为什么我之前不能打电话Pool.close()

因为join()等待工人退出。不仅仅是完成分配给他们的任务,而是真正退出。如果没有close()事先打电话,那么就没有人通知工人退出,他们就处于待命状态,准备接受进一步的任务。

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

正如 David Schwartz 指出的那样,不要调用join()“同步”——它不能达到这个目的。


ale*_*ame 4

在您的情况下,您不需要调用join()after map(),因为map()调用会阻塞,直到所有结果完成为止。

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