Python中循环创建多进程是否可行?如何等待所有子进程执行完毕再退出
原写法合理性判断
该写法完全不合理,核心问题如下:
- 无限制创建系统进程会持续消耗PID、内存资源,同时会抬高CPU上下文切换开销,运行一段时间后就会触发系统资源上限,导致程序崩溃,甚至影响操作系统上其他服务的正常运行
- 按代码逻辑funcA每0.5秒启动1个新进程,而funcB单次执行需要3秒,也就是每秒会新增2个进程,稳定运行时并发进程数会持续上涨,完全没有任何资源管控机制
更优的实现方案
推荐使用进程池做并发数管控:
- 可以使用
multiprocessing.Pool或者concurrent.futures.ProcessPoolExecutor预先设定最大并发进程数,超出并发数的任务会进入队列等待,不会无节制创建新进程占用系统资源 - 即使是需要无限循环执行funcA的场景,进程池也能把并发量控制在安全阈值内,避免资源耗尽
funcA执行10次后等待所有funcB完成再退出的实现
这里提供两种常见的实现方案:
方案1:手动收集进程对象,逐个等待执行完成
import time from multiprocessing import Process def funcA(process_list): time.sleep(0.5) process = Process(target=funcB) process.start() # 将启动的进程实例存入列表统一管理 process_list.append(process) def funcB(): time.sleep(3) print("funcB 执行结束") def main(): process_list = [] # 限制funcA仅执行10次 for _ in range(10): funcA(process_list) # 遍历所有进程,等待全部执行完成 for p in process_list: p.join() print("所有任务执行完成,程序退出") if __name__ == "__main__": main()
方案2:使用进程池实现(自带资源管控,代码更简洁)
import time from concurrent.futures import ProcessPoolExecutor def funcB(): time.sleep(3) print("funcB 执行结束") def funcA(executor): time.sleep(0.5) # 向进程池提交任务,自动调度执行 executor.submit(funcB) def main(): # max_workers参数可以自定义最大并发数,避免同时运行过多进程 with ProcessPoolExecutor(max_workers=4) as executor: for _ in range(10): funcA(executor) # 退出with上下文时会自动等待所有提交的任务执行完成 print("所有任务执行完成,程序退出") if __name__ == "__main__": main()
注意:Windows系统下使用Python多进程相关功能时,必须将进程启动逻辑放在if __name__ == "__main__"判断块内,否则会出现进程重复启动的异常。
内容的提问来源于stack exchange,提问作者aman agarwal
相关产品推荐
相关产品推荐

