我们什么时候应该调用multiprocessing.Pool.join?


96

我正在使用'multiprocess.Pool.imap_unordered'如下

from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
    do some additional processing on mapped_result

我需要打电话pool.closepool.join之后的for循环?


我一般叫pool.join()那么pool.close(),一旦我开始所有池中的线程,但使用我还没有尝试过pool.imap_unordered()作为一个迭代。
Bamcclur '16

8
调用加入或关闭的目的是什么?我没有给他们打电话,我的代码似乎运行正常。但是,我担心不调用它们会导致僵尸进程或其他细微的事情。
hch 2016年

Answers:


113

不,您没有,但是如果您不再使用游泳池,那可能是个好主意。

Tim Peters在此SO帖子中致电pool.close或致电的理由pool.join很明确:

至于Pool.close(),您应该在永远不会向池实例提交更多工作的时候才调用它。因此,通常在主程序的可并行化部分完成时调用Pool.close()。然后,当所有已分配的工作完成时,工作进程将终止。

调用Pool.join()等待工作进程终止也是一种很好的做法。除其他原因外,通常没有很好的方法来报告并行化代码中的异常(异常仅在与您的主程序正在做的事情有关的上下文中发生),而Pool.join()提供了一个同步点,可以报告发生的某些异常在您否则无法看到的工作流程中。


9
先打电话给另一个更好吗?
RSHAP

9
看来,人们喜欢叫pool.close()第一和pool.join()第二。这样,您就可以在pool.close()和之间添加工作pool.join(),而无需等待池完成执行。
Bamcclur

34
只是要添加到@Bamcclur的注释中-pool.close()首先打电话并不是一个好主意,它实际上是强制性的。从文档:必须先致电close()terminate()使用join()
Bogd

4
@Bogd但是为什么它是强制性的?您能回答这个问题吗?
agdhruv

agdhruvs问题的答案将非常棒!
鞭打

44

我遇到了相同的内存问题,因为当我不使用Python时,pool.close()以及与用于计算Levenshtein距离的函数一起使用pool.join(),Python的multiprocessing.pool的内存使用率一直在增长pool.map()。该功能运行良好,但是在Win7 64机器上没有正确收集垃圾,并且每次调用该功能之前,内存使用率一直在失控,直到整个操作系统崩溃。这是修复漏洞的代码:

stringList = []
for possible_string in stringArray:
    stringList.append((searchString,possible_string))

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()

关闭并加入池后,内存泄漏消失了。


1
ERROR: Terminated with signal 15在添加清理代码之前就收到了,pool.close();pool.join();但是在添加清理代码之后,我没有收到控制台消息。所以我怀疑至少在我的C7版本的python 2.7中,该池可能无法完全清除。
Trevor Boyd Smith,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.