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()”?
Pool.join()那么,为什么我之前不能打电话Pool.close()
因为join()等待工人退出。不仅仅是完成分配给他们的任务,而是真正退出。如果没有close()事先打电话,那么就没有人通知工人退出,他们就处于待命状态,准备接受进一步的任务。
因此,join()之前没有调用 to 的调用close()将会挂起 -join()将永远等待工作人员退出,而没有人告诉他们这样做。因此,ValueError("pool is still running")如果 yopu 尝试这样做,Python 会引发错误。
正如 David Schwartz 指出的那样,不要调用join()“同步”——它不能达到这个目的。
在您的情况下,您不需要调用join()after map(),因为map()调用会阻塞,直到所有结果完成为止。
join()之前调用close()或terminate()不正确。因为join()是阻塞调用并等待工作进程退出。因此您不能在之后重用池join()。
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |