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

Python 我们应该什么时候调用multiprocessing.Pool.join?,python,python-multiprocessing,Python,Python Multiprocessing,我正在使用“multiprocess.Pool.imap\u 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循环后加入?不需要,但如果您不再使用池

我正在使用“multiprocess.Pool.imap\u 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
的原因由Tim Peters在以下章节中阐述:

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

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


我的内存问题与我没有使用
pool.close()
pool.join()
时的内存问题相同,当我使用
pool.map()
函数计算Levenshtein距离时。该函数工作正常,但在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()

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

我通常在启动所有池线程后调用
pool.join()
,然后调用
pool.close()
,但我还没有尝试将
pool.imap\u unordered()
用作一个iterable。调用join或close有什么意义?我没有给他们打电话,我的代码似乎工作正常。但是,我担心不调用它们会导致僵尸进程或其他微妙的事情。最好先调用一个,然后再调用另一个吗?似乎人们喜欢先调用
pool.close()
,然后再调用
pool.join()
。这允许您在
pool.close()
pool.join()
之间添加工作,而无需等待池完成执行。只需添加到@Bamcclur的注释中-首先调用
pool.close()
不仅是一个好主意,实际上它是强制性的。From:在使用
join()
@Bogd之前,必须调用
close()
terminate()
,但为什么必须这样做?你们能回答这个问题吗?回答阿格德鲁夫斯的问题太棒了!我得到
错误:在添加清理代码
池.close()之前,以信号15终止;pool.join()