Python中如何让主进程等待所有子进程执行完成后再运行
Python multiprocessing主进程等待所有子进程结束方案
你编写的多进程代码本身逻辑是正确的,调用join()方法的作用就是阻塞主进程,直到对应子进程执行结束后才会继续向下执行,完全符合你要等待所有子进程结束再跑后续主进程逻辑的需求。
你看到的日志现象属于正常执行流程:
- 第一个8:23:34的主进程日志,是
start()方法调用之前的代码输出的,也就是你代码里第一个# do stuff部分的逻辑,这时候子进程还未启动,所以先打印主进程日志。 - 之后四个子进程启动,并行执行打印各自日志,此时主进程会阻塞在
join()调用处,等待所有子进程执行完毕。 - 最后8:25:19的主进程日志,是所有子进程全部退出、所有
join()调用返回后,第二个# do stuff部分的输出,中间的时间差就是你的子进程总执行时长。
如果需要验证逻辑正确性,可以在子进程末尾增加退出日志、在所有join()调用后立刻增加主进程日志,就能清晰看到执行顺序:
import multiprocessing as mp import logging logging.basicConfig(format='[%(asctime)s: %(levelname)s/%(processName)s] %(message)s', level=logging.INFO) class TaskRunner: def __function1(self): logging.info("Process-1 开始执行") # 你的业务逻辑 logging.info("Process-1 执行结束") def __function2(self): logging.info("Process-2 开始执行") # 你的业务逻辑 logging.info("Process-2 执行结束") def __function3(self): logging.info("Process-3 开始执行") # 你的业务逻辑 logging.info("Process-3 执行结束") def __function4(self): logging.info("Process-4 开始执行") # 你的业务逻辑 logging.info("Process-4 执行结束") def run(self): logging.info("主进程:前置逻辑执行完成,准备启动子进程") p1 = mp.Process(target=self.__function1) p2 = mp.Process(target=self.__function2) p3 = mp.Process(target=self.__function3) p4 = mp.Process(target=self.__function4) p1.start() p2.start() p3.start() p4.start() p1.join() p2.join() p3.join() p4.join() logging.info("主进程:所有子进程已退出,开始执行后续逻辑") if __name__ == '__main__': runner = TaskRunner() runner.run()
如果你需要更简洁的写法,避免手动管理多个进程实例,可以使用进程池实现相同效果:
with mp.Pool(processes=4) as pool: # 提交所有任务到进程池 pool.apply_async(self.__function1) pool.apply_async(self.__function2) pool.apply_async(self.__function3) pool.apply_async(self.__function4) # 关闭进程池,等待所有任务执行完成 pool.close() pool.join() # 此处开始执行主进程后续逻辑
内容的提问来源于stack exchange,提问作者Minura Punchihewa
相关产品推荐
相关产品推荐

