Python multiprocessing中join进程的正确方法及两种写法差异
multiprocessing多进程join的正确用法说明
要实现主程序等待所有子进程执行完成后再继续运行,第二种写法是唯一可靠的正确实现,两种写法的核心差异如下:
第一种写法的缺陷
代码实现:
for i in range(100): j = Process(target=somefunc,args=(i,)) j.start() j.join()
该写法的问题在于:循环过程中变量j会被重复赋值,循环结束后j仅指向最后一个被创建的子进程,最终只会调用最后1个进程的join()方法。
主程序只会等待最后1个子进程执行完毕就继续向下运行,其余99个子进程如果还未执行完成,会脱离主进程管控在后台继续运行,完全不符合需求。只有在所有前面的子进程执行耗时都短于最后一个子进程的极端偶然场景下,才会刚好达到预期效果,完全不具备可用性。
第二种写法的正确性
代码实现:
jobs = [] for i in range(100): j = Process(target=somefunc,args=(i,)) jobs.append(j) j.start() for j in jobs: j.join()
该写法通过列表提前存储了所有创建的子进程对象,循环结束后遍历列表对每个子进程逐个调用join()方法,主程序会阻塞直到所有子进程全部退出后才会继续向下执行,是符合需求的标准实现。
Python 2.6.6版本适配说明
Python 2.6.6版本的multiprocessing模块完全兼容第二种写法的语法,start()、join()方法的逻辑和更高版本Python完全一致,不需要做额外修改即可直接运行。
内容的提问来源于stack exchange,提问作者Welsige
相关产品推荐
相关产品推荐

