在使用 python 多处理时使用 pool.map 时是否有理由调用 join ?
Is there ever a reason to call join when using pool.map while using python multiprocessing?
As multiprocessing.Pool().map()
阻止主进程继续执行。而且,到处都说 join
应该在 close
之后调用,这是一种很好的做法。我想通过示例了解在 multiprocessing.Pool().map()
调用
之后使用 join
有意义的场景
它在哪里声明“良好做法”?如果您不再需要池,即您不打算提交任何更多任务 and 您的程序不会终止,但您想要释放池使用的资源并“清理” up”,你可以显式或隐式地调用 terminate,如果你使用 with
块,就会发生这种情况,如下所示:
with Pool() as pool:
...
# terminate is called implicitly when the above block exits
但请注意 terminate
将 不会 等待未完成的任务(如果有的话)完成。如果提交的任务已排队 运行 但尚未 运行ning 或当前正在 运行ning,它们将被取消。
调用 close
会阻止提交更多任务,只有当您不再需要池时才应调用。调用 join
,这需要您先调用 close
,将等待所有未完成的任务完成以及池中的进程终止。但是,如果您使用 map
,根据定义,它将阻塞直到提交的任务完成。因此,除非您提交了任何 other 任务,否则没有必要先调用 close
然后再调用 join
。但是,这些调用对于等待使用 apply_async
提交的未完成任务很有用,而不必在 AsyncResult
实例 returned 上显式调用 get
那个电话:
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()
当然,以上仅在您不需要辅助函数的任何 return 值时才有用。
所以回答你的问题:不是真的;仅当您碰巧有 other 个异步提交的任务,您正在等待其完成。但是,如果您不打算立即退出程序,这是立即释放池资源的一种方法,另一种方法是调用方法 terminate
.
As multiprocessing.Pool().map()
阻止主进程继续执行。而且,到处都说 join
应该在 close
之后调用,这是一种很好的做法。我想通过示例了解在 multiprocessing.Pool().map()
调用
join
有意义的场景
它在哪里声明“良好做法”?如果您不再需要池,即您不打算提交任何更多任务 and 您的程序不会终止,但您想要释放池使用的资源并“清理” up”,你可以显式或隐式地调用 terminate,如果你使用 with
块,就会发生这种情况,如下所示:
with Pool() as pool:
...
# terminate is called implicitly when the above block exits
但请注意 terminate
将 不会 等待未完成的任务(如果有的话)完成。如果提交的任务已排队 运行 但尚未 运行ning 或当前正在 运行ning,它们将被取消。
调用 close
会阻止提交更多任务,只有当您不再需要池时才应调用。调用 join
,这需要您先调用 close
,将等待所有未完成的任务完成以及池中的进程终止。但是,如果您使用 map
,根据定义,它将阻塞直到提交的任务完成。因此,除非您提交了任何 other 任务,否则没有必要先调用 close
然后再调用 join
。但是,这些调用对于等待使用 apply_async
提交的未完成任务很有用,而不必在 AsyncResult
实例 returned 上显式调用 get
那个电话:
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()
当然,以上仅在您不需要辅助函数的任何 return 值时才有用。
所以回答你的问题:不是真的;仅当您碰巧有 other 个异步提交的任务,您正在等待其完成。但是,如果您不打算立即退出程序,这是立即释放池资源的一种方法,另一种方法是调用方法 terminate
.