python - 在使用 python 多处理时使用 pool.map 时是否有理由调用 join ?
问题描述
Asmultiprocessing.Pool().map()
阻止主进程继续执行。而且,它在任何地方都被声明join
为close
一种好的做法。我想通过示例了解在什么情况下使用在通话join
后有意义multiprocessing.Pool().map()
解决方案
它在哪里说明“良好做法”?如果您不再需要池,即您不打算提交任何更多任务并且您的程序没有终止但您想释放池使用的资源并立即“清理”,您可以调用终止显式或隐式,如果您使用with
如下块,则会发生这种情况:
with Pool() as pool:
...
# terminate is called implicitly when the above block exits
但请注意,terminate
不会等待未完成的任务(如果有)完成。如果有提交的任务排队运行但尚未运行或当前正在运行,它们将被取消。
调用close
可防止提交进一步的任务,并且仅应在您不再使用池时调用。Callingjoin
需要您首先调用close
,它将等待任何未完成的任务完成并且池中的进程终止。但是,如果您正在使用map
,根据定义,它会阻塞直到提交的任务完成。因此,除非您提交了任何其他任务,否则没有必要先close
调用join
. 但是,这些调用对于等待提交的未完成任务很有用,例如,apply_async
无需显式调用该调用返回get
的AsyncResult
实例即可完成:
pool = Pool()
pool.submit(worker1, args=(arg1, arg2))
pool.submit(worker2, args=(arg3,))
pool.submit(worker3)
# wait for all 3 tasks to complete
pool.close()
pool.join()
当然,上述内容仅在您不需要工作函数的任何返回值时才有用。
所以回答你的问题:不是真的;仅当您碰巧有其他异步提交的任务正在等待其完成时。但是,如果您不打算立即退出程序,这是立即释放池资源的一种方法,另一种方法是调用 method terminate
。
推荐阅读
- javascript - 我可以使用 JavaScript 的 fetch() 函数从 file.php 调用特定方法吗?
- angular - Angular10 - 等待第一行完成
- angular - 将 2 个 firebase 集合合并到一个数组中
- system-verilog - 在函数中放置工厂注册时出现空项错误
- cmake - 无法在调试构建配置中使用 assimp 库
- java - com.google.firebase.database.Query 无法转换为 com.google.firebase.database.DatabaseReference
- python - % 差异数据透视表 python
- google-cloud-firestore - 存储选择器中的选定值以在其他视图中使用 - SwiftUI
- c++ - 如何使用 QStyledItemDelegate 在 QTreeWidget 中拥有不同高度的 QTreeWidgetItems?
- html - 将文本保留在 div 中