首页 > 解决方案 > 在使用 python 多处理时使用 pool.map 时是否有理由调用 join ?

问题描述

Asmultiprocessing.Pool().map()阻止主进程继续执行。而且,它在任何地方都被声明joinclose一种好的做法。我想通过示例了解在什么情况下使用在通话join后有意义multiprocessing.Pool().map()

标签: pythonpython-3.xmultiprocessingpython-multiprocessing

解决方案


它在哪里说明“良好做法”?如果您不再需要池,即您不打算提交任何更多任务并且您的程序没有终止但您想释放池使用的资源并立即“清理”,您可以调用终止显式或隐式,如果您使用with如下块,则会发生这种情况:

with Pool() as pool:
   ...
# terminate is called implicitly when the above block exits

但请注意,terminate不会等待未完成的任务(如果有)完成如果有提交的任务排队运行但尚未运行或当前正在运行,它们将被取消。

调用close可防止提交进一步的任务,并且仅应在您不再使用池时调用。Callingjoin需要您首先调用close,它将等待任何未完成的任务完成并且池中的进程终止。但是,如果您正在使用map,根据定义,它会阻塞直到提交的任务完成。因此,除非您提交了任何其他任务,否则没有必要先close调用join. 但是,这些调用对于等待提交的未完成任务很有用,例如,apply_async无需显式调用该调用返回getAsyncResult实例即可完成:

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


推荐阅读