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

时间:2016-07-08 16:30:13

标签: 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

我是否需要在for循环后调用pool.closepool.join

2 个答案:

答案 0 :(得分:62)

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

Tim Peters在this SO post中很好地说出了pool.closepool.join来电的原因:

  

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

     

调用Pool.join()等待工作进程终止也是一种很好的做法。除了其他原因之外,通常没有好方法来报告并行化代码中的异常(异常发生在上下文中,与主程序的作用有些模糊),而Pool.join()提供了一个可以报告的同步点在工作进程中发生的一些例外情况,你从未见过。

答案 1 :(得分:26)

当我使用pool.close()pool.join()使用pool.map()计算Levenshtein距离的函数时,我遇到与Memory usage keep growing with Python's multiprocessing.pool相同的内存问题。该功能运行良好,但在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()

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