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
相关产品推荐
相关产品推荐

