什么时候调用多处理?

我正在使用“ multiprocess. Pool.imap _ unorder”,如下所示

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

127327 次浏览

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

调用 pool.closepool.join的理由由 Tim Peters 在 这个职位中说得很好:

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

调用 Pool.join ()等待辅助进程终止也是一个很好的实践。其中一个原因是,在并行代码中通常没有很好的方法来报告异常(异常发生在与主程序正在做的事情相关的上下文中) ,而 Pool.join ()提供了一个同步点,可以报告一些在辅助进程中发生的异常,这些异常在其他情况下是看不到的。

当我使用带有计算莱文斯坦距离的函数的 pool.map()时,没有使用 pool.close()pool.join()时,我的内存问题与 使用 Python 的 multiprocessing.pool,内存使用量不断增长相同。这个函数工作得很好,但是在 Win764机器上没有正确地收集垃圾,而且每次调用这个函数时,内存使用量都在不断增长,直到整个操作系统崩溃。下面是修复漏洞的代码:

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


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

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