多核Python:multiprocessing与zeroMQ的对比?
我想写一段 python
代码,用来加载一个数据集作为输入,然后对它进行分析。
会有5个并行的进程来分析这些数据,每个进程会用不同的方式处理数据,也就是每个进程的处理方法都是独特的。
在任何处理开始之前,master
脚本(也就是负责“启动”所有不同子进程的那个脚本)会先定义一个空列表。
我希望所有不同的进程都能把它们的输出写入到上面提到的同一个列表中(这意味着,每个进程都能直接操作在 master
脚本中定义的那个列表)。
也就是说,如果 process1
改变了这个列表的第一个值,其他所有进程在运行时都能看到这个列表的第一个值已经被改变了。
我感觉可以用两个不同的 python
模块来解决这个问题:multiprocessing
和 zeroMQ
。
在这种情况下,有没有理由更倾向于使用其中一个而不是另一个?如果我不是在同一台服务器上运行 master
脚本,而是把进程分散到不同的(多台)服务器上,这个答案会改变吗?
(如果这有关系的话,我是在使用 Linux
)
2 个回答
你不能把苹果和橙子拿来比较。
multiprocessing 是一个库,用来创建多个进程。
zmq 是一个库,让进程之间可以通过消息来交流。
它们的功能不同。
如果这两个选项是你唯一的选择,并且你确定要在多台机器上分担负载,那么在这两个选项中,ZeroMQ 是唯一合适的选择。
Python 的 multiprocessing 模块是用来在单台机器上分配负载到不同的进程或核心上。根据我所知,multiprocessing 模块背后并没有网络协议,这在 相关文档 的第一段中也有说明。
ZeroMQ 可以在单台机器上使用它的进程间通信(IPC)协议进行类似的进程间消息传递,但它也有基于网络的协议,可以让你在不同机器上运行的进程之间发送消息。
不过,这个问题有点像一个 XY问题,因为你似乎随意把选择范围缩小到了仅仅两个选项,而实际上还有很多其他方法可以用 Python 实现分布式程序。
编辑 我之前的回答是错误的,我不能删除一个被接受的回答,所以把它转成了维基,以防有人想要纠正它。简单来说,我在匆忙中误读了文档。Python 的 multiprocessing 确实支持跨网络边界的进程间通信。ZeroMQ 的一个主要区别是,它设计得不依赖于平台,因此你可以在不同平台上混合使用客户端/服务器代理,而 Python 的 multiprocessing 是一个包含了很多功能的选项,前提是客户端/服务器进程是与 Python 绑定的。