现在,当我生成一个子进程时,我在父进程中实例化一个消息队列,并将其传递给构造函数参数中的子进程,如下所示:
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")
语句中实例化队列,我以后是否会遇到某种问题?两种方式都有优势吗?还是等价的?
答案 0 :(得分:1)
这没有什么区别,因为就像您已经写过的那样,Process.__init__()
在父级中执行。
这表示问题标题:
“应该在子进程还是父进程中实例化消息队列?”
是错误的,因为它在父进程中以任何一种方式发生。
这只是代码组织的问题,对于每个进程的连接,第二个代码段很有意义。
如果每个进程确实需要一个连接,则可以切换到multiprocessing.Pipe
以提高性能。常规multiprocessing.Queue
在第一个.put()
上产生一个供料器线程,对于单生产者/单消费者(SPSC)连接,您不需要它。