问题:我们什么时候应该调用multiprocessing.Pool.join?
我正在使用’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.close
或pool.join
之后的for循环?
回答 0
不,您没有,但是如果您不再使用游泳池,那可能是个好主意。
Tim Peters在此SO帖子中调用pool.close
或调用的理由pool.join
很明确:
至于Pool.close(),您应该在永远不会向池实例提交更多工作的时候才调用它。因此,通常在主程序的可并行化部分完成时调用Pool.close()。然后,当所有已分配的工作完成时,工作进程将终止。
调用Pool.join()等待工作进程终止也是一种很好的做法。除其他原因外,通常没有很好的方法来报告并行化代码中的异常(异常仅在与您的主程序正在做的事情有关的上下文中发生),而Pool.join()提供了一个同步点,可以报告发生的某些异常在您否则无法看到的工作流程中。
回答 1
我遇到了相同的内存问题,因为当我不使用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()
关闭并加入池后,内存泄漏消失了。