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()
- 其他可选排查点
- 若在Windows系统运行,必须把进程启动逻辑包裹在
if __name__ == '__main__'判断下,否则Windows默认的spawn进程启动方式会重复执行顶层代码,导致进程无限启动卡住。 - 检查
generate_parent函数内部是否有未捕获的异常、或永久阻塞的IO操作,若子进程自身卡住未执行queue.put(),也会导致主进程读队列时停滞,可以在generate_parent中增加运行日志确认执行进度。 - 可以给
queue.get()增加超时参数,比如queue.get(timeout=10),超时后会抛出异常,方便快速排查是死锁问题还是子进程运行异常。
- 若在Windows系统运行,必须把进程启动逻辑包裹在
内容的提问来源于stack exchange,提问作者sbb
相关产品推荐
相关产品推荐

