首页 > 解决方案 > 消息队列应该在子进程还是父进程中实例化?

问题描述

现在当我生成一个子进程时,我在父进程中实例化一个消息队列,并在构造函数参数中将它传递给子进程,如下所示:

import multiprocessing as mp

class testProcess(mp.Process):
    def __init__(self, msgQueue):
        mp.Process.__init__(self, daemon=True)
        self.msgQueue = msgQueue    

if __name__ == "__main__":
    # Instantiate queue in parent process and pass to child:
    msgQueue = mp.Queue()
    t = testProcess(msgQueue)

我这样做是因为我在学习如何使用多处理时看到的所有示例都是这样做的。

但是,我现在有很多子进程,在父进程中生成一堆队列并跟踪它们变得有点难看。在子进程的方法中生成队列会更干净__init__,并且只需在父进程中将其作为子进程命名空间的一部分进行访问,如下所示:

import multiprocessing as mp

class testProcess(mp.Process):
    def __init__(self):
        mp.Process.__init__(self, daemon=True)
        # Instantiate queue from within child __init__:
        self.msgQueue = mp.Queue()


if __name__ == "__main__":
    t = testProcess()
    # Now I can access the queue like so:
    t.msgQueue.put("hi there child")

我想从技术上讲,__init__Process 类的语句无论如何都是在父进程中执行的(我认为?),所以我认为它不会有任何区别。

__init__所以,我的问题是,如果我在子进程语句中实例化队列,我以后会遇到某种问题吗?两种方式都有什么优势吗?或者它们是等价的吗?

标签: python-3.xprocessmessage-queuepython-multiprocessing

解决方案


这没有什么区别,因为就像您已经写的那样,Process.__init__()是在父级中执行的。

这意味着问题标题:

“消息队列应该在子进程还是父进程中实例化?”

是错误的,因为它发生在父进程中。

这只是代码组织的问题,对于每个进程的连接,您的第二个代码片段非常有意义。

如果你真的需要每个进程一个连接,你可以切换到multiprocessing.Pipe一些性能改进。常规会multiprocessing.Queue在第一个上生成一个馈线线程.put(),对于单生产者/单消费者 (SPSC) 连接,您不需要它。


推荐阅读