我使用multiprocessing lib创建了多线程来处理文件列表(20多个文件)。
运行py文件时,我将池号设置为4。但是在cmd中,它显示有10个以上的进程。而且大多数已经运行了很长时间。因为文件很大,并且处理时间很长,所以我不确定该进程是挂起还是仍在执行。
所以我的问题是:
如果正在执行,如何将进程号精确设置为4?
如果挂起,则表示子进程完成后不会关闭。我可以设置完成后自动关闭吗?
from multiprocessing import Pool
poolNum = int(sys.argv[1])
pool = Pool(poolNum)
pool.map(processFunc, fileList)
答案 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