You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:24:03