我生成一个子进程,它简单地将数据从一个队列复制到另一个队列。问题是:在子进程的目标函数返回后,子进程似乎不像预期的那样存在。它挂在pdet.join()线上。
是什么导致它挂起来的?
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
print(i)
qdet.put(im)
print('load exit.')
def detect(qdet, qshw):
while True:
im = qdet.get()
if im is 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()
qdet.put(None)
pdet.join()
if __name__ == '__main__':
mp.freeze_support()
main()发布于 2022-07-22 18:42:58
这是因为如果进程将项放在队列中,则在从另一端刷新项目之前,它不会退出。从文件中:
请记住,将项放入队列的进程将在终止之前等待,直到所有缓冲项都由“馈线”线程输入到底层管道。(子进程可以调用队列的Queue.cancel_join_thread方法以避免这种行为。)
这意味着,每当您使用队列时,都需要确保所有已放在队列中的项最终都将在进程加入之前被移除。否则,您无法确保已将项放入队列的进程将终止。还请记住,非守护进程将自动连接。
因此,您应该确保队列中的所有项在尝试加入之前都已被删除。但是,您也可以通过使用管理器队列来解决这一问题,这会带来一些开销,但不受此类问题的影响:
def main():
with mp.Manager() as manager:
qdet = manager.Queue()
qshw = manager.Queue()
load(qdet)
pdet = mp.Process(target=detect, args=(qdet, qshw,))
pdet.start()
qdet.put(None)
pdet.join()https://stackoverflow.com/questions/73078478
复制相似问题