“多处理”会自动关闭完成的子进程吗?

时间:2018-12-27 14:18:18

标签: python multithreading multiprocessing

我使用multiprocessing lib创建了多线程来处理文件列表(20多个文件)。

运行py文件时,我将池号设置为4。但是在cmd中,它显示有10个以上的进程。而且大多数已经运行了很长时间。因为文件很大,并且处理时间很长,所以我不确定该进程是挂起还是仍在执行。

所以我的问题是:

如果正在执行,如何将进程号精确设置为4?

如果挂起,则表示子进程完成后不会关闭。我可以设置完成后自动关闭吗?

from multiprocessing import Pool
poolNum = int(sys.argv[1])
pool = Pool(poolNum)
pool.map(processFunc, fileList)

1 个答案:

答案 0 :(得分:1)

直到Pool版或close版开始(IIRC terminate至少目前涉及参考周期,因此,即使最后一次对Pool的实时引用消失了,Pool也没有被确定性地收集,即使在使用引用计数并且通常具有确定性行为的CPython上也是如此。

由于您使用的是Pool,因此肯定会在map返回时完成您的工作,因此最简单的解决方案是使用map语句来保证终止:

with

正如我所评论的那样,我使用了一个from multiprocessing import Pool def main(): poolNum = int(sys.argv[1]) with Pool(poolNum) as pool: # Pool created pool.map(processFunc, fileList) # terminate has been called, all workers will be killed # Adding main guard so this code is valid on Windows and anywhere else which # doesn't use forking for whatever reason if __name__ == '__main__': main() 函数,该函数带有防止在main上调用的标准防护,因为Windows 通过重新导入主模块来模拟分叉(但未命名) import);没有警卫,您可能会导致子进程自动创建新进程,这是有问题的。

旁注:如果您要分派一堆任务但不立即等待它们(因此,在创建池时您不希望在附近的任何位置终止池,而是要确保及时清理工人) ,您仍然可以使用上下文管理来提供帮助。分配所有任务后,只需use contextlib.closing__main__池;您必须在close块结束之前分派所有任务,但是您可以稍后检索结果,并且在计算所有结果时,子进程将关闭。例如:

with