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

时间:2019-11-20 19:52:33

标签: python-3.x process message-queue python-multiprocessing

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

cellContent

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

但是,我现在有很多子进程,并且在父进程中产生一堆队列并对其进行跟踪越来越难看。在子进程的export const chatsReducer = createReducer({}, on(fromActions.fetchChatSuccess, (state, {chat}) => { return { ...state, chats: { ...state.chats, [chat.chatId]: chat, // <-- You override here the current state of chats } } }) ); export const requestsReducer = createReducer([], ); export const requestedByReducer = createReducer([], ); export const chatSummaryReducer = createReducer([], ); export const reducers: ActionReducerMap<State> = { requests: requestsReducer; requestedBy: requestedByReducer; chatSummaries: chatSummaryReducer; chats: chatsReducer }; 方法内生成队列,并像子命名空间的一部分那样在父级中简单地访问队列,这样会更干净:

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)

从技术上讲,我猜想Process类的__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") 语句中实例化队列,我以后是否会遇到某种问题?两种方式都有优势吗?还是等价的?

1 个答案:

答案 0 :(得分:1)

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

这表示问题标题:

  

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

是错误的,因为它在父进程中以任何一种方式发生。

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

如果每个进程确实需要一个连接,则可以切换到multiprocessing.Pipe以提高性能。常规multiprocessing.Queue在第一个.put()上产生一个供料器线程,对于单生产者/单消费者(SPSC)连接,您不需要它。