python-3.x - 消息队列应该在子进程还是父进程中实例化?
问题描述
现在当我生成一个子进程时,我在父进程中实例化一个消息队列,并在构造函数参数中将它传递给子进程,如下所示:
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__
所以,我的问题是,如果我在子进程语句中实例化队列,我以后会遇到某种问题吗?两种方式都有什么优势吗?或者它们是等价的吗?
解决方案
这没有什么区别,因为就像您已经写的那样,Process.__init__()
是在父级中执行的。
这意味着问题标题:
“消息队列应该在子进程还是父进程中实例化?”
是错误的,因为它发生在父进程中。
这只是代码组织的问题,对于每个进程的连接,您的第二个代码片段非常有意义。
如果你真的需要每个进程一个连接,你可以切换到multiprocessing.Pipe
一些性能改进。常规会multiprocessing.Queue
在第一个上生成一个馈线线程.put()
,对于单生产者/单消费者 (SPSC) 连接,您不需要它。
推荐阅读
- enterprise-architect - 如何从我的个人资料中隐藏刻板印象标签
- php - 返回成功的 ping 但在发生致命错误之后
- c# - C# WPF 在套接字发送和接收数据时显示加载屏幕 C#
- java - 生成回文词
- vb.net - Sage200c SDK 在 Web 表单中崩溃
- ios - 如何使用 UIStackView 更改 UITableViewCell 的布局
- ubuntu-18.04 - Nextcloud 作为子域
- reactjs - Django-rest 框架、React JS、Axios- 发布包含图像文件的 JSON 数据
- machine-learning - 带逻辑回归的素数标识符
- git - 是否可以跟踪子模块内的文件?