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

hch*_*hch 63 python python-multiprocessing

我正在使用'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
Run Code Online (Sandbox Code Playgroud)

我需要打电话pool.close还是pool.join在for循环之后?

Bam*_*lur 77

不,你没有,但如果你不再使用游泳池,这可能是一个好主意.

蒂姆·彼得斯在这篇SO帖子中打电话pool.closepool.join说得好的原因:

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

调用Pool.join()以等待工作进程终止也是一种很好的做法.除了其他原因,往往是报告在并行代码中的异常没有什么好办法(发生的异常在上下文中只隐约涉及到你的主程序是做),和Pool.join()提供了一个同步点可以报告说发生了一些异常在工作流程中,你从来没有看到过.

  • 只是为了添加@Bamcclur的评论 - 首先调用`pool.close()`并不是一个好主意,它实际上是强制性的.来自[docs](https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool):在使用`join之前必须调用`close()`或`terminate()` )`. (25认同)
  • 在另一个之前打电话更好吗? (7认同)
  • 似乎人们喜欢先调用`pool.close()`然后调用`pool.join()`.这允许你在`pool.close()`和`pool.join()`之间添加工作,它不需要等待池完成执行. (6认同)
  • @Bogd但是*为什么*它是强制性的?你能回答这个吗(/sf/ask/4173281031/ -before-po?)请问有问题吗? (5认同)

Ody*_*aca 36

我有同样的内存问题,因为当我没有使用和使用计算Levenshtein距离的函数时,内存使用量会随着Python的multiprocessing.pool而增长.该功能运行良好,但没有在Win7 64机器上正确地进行垃圾收集,并且每次调用该函数时内存使用量都会逐渐失控,直到整个操作系统关闭为止.这是修复泄漏的代码:pool.close()pool.join()pool.map()

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

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)

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