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

Multiprocess.Process目标函数返回后未退出,join()挂起问题排查

问题原因及修复方案

核心原因

你的代码挂起的根源是目标队列qshw没有消费者,导致子进程阻塞:

  • detect子进程会把从qdet取出的500张图片全部存入qshw,但主进程完全没有读取qshw的逻辑。
  • multiprocessing的Queue有容量限制,当队列被填满后,qshw.put(im)会进入无限阻塞状态,detect函数根本无法执行到读取qdet中None的退出逻辑,子进程也就无法终止,最终导致主进程的pdet.join()一直等待。

修复方案

方案一:添加qshw的消费逻辑(推荐)

在主进程中新增代码读取qshw的内容,让detect子进程能顺利执行完所有操作:

import numpy as np
import multiprocessing as mp

def load(qdet):
    i = 0
    while i < 500:
        im = np.zeros((480, 640, 3), 'uint8')
        i += 1
        qdet.put(im)
    print('load exit.')

def detect(qdet, qshw):
    while True:
        im = qdet.get()
        if im is None:
            qshw.put(None)  # 给消费者发送结束信号
            break
        qshw.put(im)
    print('detect exit.')

def main():
    qdet = mp.Queue()
    qshw = mp.Queue()

    load(qdet)

    pdet = mp.Process(target=detect, args=(qdet, qshw,))
    pdet.start()

    # 新增:消费qshw中的数据
    while True:
        item = qshw.get()
        if item is None:
            break
        # 此处可添加图片处理逻辑,比如打印、保存等

    qdet.put(None)
    pdet.join()

if __name__ == '__main__':
    mp.freeze_support()
    main()

方案二:移除无用的qshw队列

如果你的业务不需要把数据转存到qshw,直接删除相关逻辑即可:

import numpy as np
import multiprocessing as mp

def load(qdet):
    i = 0
    while i < 500:
        im = np.zeros((480, 640, 3), 'uint8')
        i += 1
        qdet.put(im)
    print('load exit.')

def detect(qdet):
    while True:
        im = qdet.get()
        if im is None:
            break
        # 原qshw.put逻辑删除
    print('detect exit.')

def main():
    qdet = mp.Queue()

    load(qdet)

    pdet = mp.Process(target=detect, args=(qdet,))
    pdet.start()

    qdet.put(None)
    pdet.join()

if __name__ == '__main__':
    mp.freeze_support()
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:15:39