繁体   English   中英

Python多处理队列未返回

[英]Python multiprocessing queue not returning

我正在尝试使用多处理模块来加载一堆作业(不返回任何内容-它们只是保存到磁盘上),而且我似乎无法退出多处理队列。 我已经查看了stackoverflow上的所有链接,而Google仍然不明白为什么作业未正确完成。

该代码似乎运行良好(即,它以适当的顺序对任务进行排队和处理-而不是为每个内核分配任务列表)。 但我似乎无法弄清楚如何退出队列:(

任何建议都非常感激,我已经花了很多时间在此上。

这是我的代码:

        import multiprocessing as mp

        # make arg list first
        args_in = []
        for channel in channels:
            args_in.append(...)  # append some stuff

        # make a queue and add list to queue:
        #q = mp.Queue()
        q = mp.JoinableQueue()
        for arg in args_in: 
            q.put(arg)        # add list of args

        # worker function
        def worker(q):
          for item in iter(q.get, None):
            res = cluster_channels_chunks_args(item)
            q.task_done()


        # make a list of processes and add worker function
        procs = []
        for i in range(CONFIG.resources.n_processors):
            procs.append(mp.Process(target=worker, args=(q,)))
            procs[-1].daemon = True
            procs[-1].start()

        for p in procs:
            p.join()

[编辑]如果我注释掉procs [-1] .daemon = True,我将不再获得正确的行为,并且似乎为内核分配了必须分别完成的作业列表。 我需要内核在完成任务后立即将其动态地从池中夺取(否则,某些内核会先完成任务,而其他系统又会挂起系统挂起时间,以至于一个内核无法完成许多任务)。

在最后一行中,您正在join守护进程。 根据Python 文档

请注意,不允许守护进程创建子进程。 否则,如果守护进程在其父进程退出时被终止,它将使其子进程变成孤儿。 另外,这些不是Unix守护程序或服务,它们是正常的进程,如果非守护进程退出,它们将终止(而不加入)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM