Python 我们应该什么时候调用multiprocessing.Pool.join?
我正在使用“multiprocess.Pool.imap\u unordered”,如下所示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循环后加入?不需要,但如果您不再使用池
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()但是在添加了清理代码之后,我没有得到控制台消息。所以我怀疑,至少在我的C7版本Python2.7上,池可能没有完全清理干净。