我正在使用' 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.close
或pool.join
?
答案 0 :(得分:62)
不,你不是,但如果你不再使用游泳池,这可能是一个好主意。
Tim Peters在this SO post中很好地说出了pool.close
或pool.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()
关闭并加入游泳池后,内存泄漏就消失了。