首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当目标函数返回时,Multiprocess.Process不退出

当目标函数返回时,Multiprocess.Process不退出
EN

Stack Overflow用户
提问于 2022-07-22 09:59:17
回答 1查看 111关注 0票数 0

我生成一个子进程,它简单地将数据从一个队列复制到另一个队列。问题是:在子进程的目标函数返回后,子进程似乎不像预期的那样存在。它挂在pdet.join()线上。

是什么导致它挂起来的?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2022-07-22 18:42:58

这是因为如果进程将项放在队列中,则在从另一端刷新项目之前,它不会退出。从文件中:

请记住,将项放入队列的进程将在终止之前等待,直到所有缓冲项都由“馈线”线程输入到底层管道。(子进程可以调用队列的Queue.cancel_join_thread方法以避免这种行为。)

这意味着,每当您使用队列时,都需要确保所有已放在队列中的项最终都将在进程加入之前被移除。否则,您无法确保已将项放入队列的进程将终止。还请记住,非守护进程将自动连接。

因此,您应该确保队列中的所有项在尝试加入之前都已被删除。但是,您也可以通过使用管理器队列来解决这一问题,这会带来一些开销,但不受此类问题的影响:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73078478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档