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

Python multiprocessing调用Process.start()后代码无报错卡住问题求助

问题根因与修复方案
  • 核心死锁原因:代码执行顺序不符合multiprocessing.Queue的使用规则
    你当前的执行逻辑为「启动子进程→等待所有子进程结束→读取队列数据」,这个顺序会直接触发双向等待死锁:

mp.Queue的写入操作存在底层缓冲,当缓冲已满且没有进程读取队列数据时,所有执行queue.put()的子进程会永久阻塞,无法退出。主进程此时卡在process.join()等待子进程结束,子进程又在等待主进程读取队列释放写入空间,二者互相等待导致程序永久停滞。

  • 修复方案:调换读取队列和join子进程的顺序
    先把队列内的所有数据读取完成,再等待子进程退出,修正后的代码如下:
import multiprocessing as mp

...

parents = []
queue = mp.Queue(maxsize=poolSize - 1)
processes = []
for _ in range(poolSize - 1):
    processes.append(mp.Process(target=generate_parent, args=(queue,)))
for process in processes:
    process.start()
# 先读队列再join子进程,避免死锁
for _ in range(poolSize - 1):
    parents.append(queue.get())
for process in processes:
    process.join()
  • 其他可选排查点
    1. 若在Windows系统运行,必须把进程启动逻辑包裹在if __name__ == '__main__'判断下,否则Windows默认的spawn进程启动方式会重复执行顶层代码,导致进程无限启动卡住。
    2. 检查generate_parent函数内部是否有未捕获的异常、或永久阻塞的IO操作,若子进程自身卡住未执行queue.put(),也会导致主进程读队列时停滞,可以在generate_parent中增加运行日志确认执行进度。
    3. 可以给queue.get()增加超时参数,比如queue.get(timeout=10),超时后会抛出异常,方便快速排查是死锁问题还是子进程运行异常。

内容的提问来源于stack exchange,提问作者sbb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:09:04