多核Python:多进程与ZeroMQ?

5
我想编写Python代码,以加载数据集作为输入并对其进行分析。
将有5个并行进程分析数据 - 每个进程将以独特的方式以不同的方式处理数据。
在任何处理开始之前,“主”脚本(将“启动”所有不同子进程的脚本)将定义一个空列表。
我希望所有不同的进程将其输出写入上述相同的列表中(这意味着每个进程都能够直接操作在“主”脚本中定义的列表)。
也就是说,如果process1更改了该列表的第一个值,则所有其他进程(在运行时)将看到该列表的第一个值已更改。
我感觉可以使用2个不同的Python模块来解决此问题:multiprocessing和zeroMQ。
在这种情况下,是否有理由更喜欢其中之一?如果我将“主”脚本分割在不同(多个)服务器之间而不是在同一台服务器上运行,您的答案是否会改变?
(如果这很重要,我正在使用Linux)

我不知道多进程和zeromq应该有什么共同点,以及它们在这里应该如何相关。更多的是关于如何进行并行处理(线程 vs. 进程)以及如何实现工作进程之间的通信。 - user2665694
Sentinel:正确;但是,multiprocessingzeroMQ都是可以进行并行处理的模块。问题是,哪一个在这种情况下更灵活/更合适?此外,在希望“越过”一台机器并使用多台机器时,哪一个更合适? - user3262424
可能是Python多进程问题?的重复。 - Michael Dillon
@Michael Dillon:这不是重复;相反,它旨在提供一些线索,哪种方法最合适:使用multiprocessing还是zeroMQ - user3262424
2个回答

5

你不能把苹果和橘子相比较。

multiprocessing是一个库,可以派生出多个进程。

zmq是一个库,允许进程之间使用消息进行通信。

它们执行不同的任务。


2
我猜OP是在询问多进程队列和zeromq的做法之间的区别。 - Stuart Axon
我喜欢使用ZeroRPC编写多进程调用的分布式服务器,这非常有趣! - Phyo Arkar Lwin

1

如果这是你唯一的两个选择,并且你确定要在多台机器上分配负载,那么ZeroMQ是唯一符合要求的选择。

Python的multiprocessing模块用于在单台机器上分配进程/核心的负载。据我所知,multiprocessing模块下没有网络协议,这可以从附带文档的第一段中得到证实。

ZeroMQ可以使用其IPC协议在单台机器上进行类似的进程间通信,但它还具有基于网络的协议,允许您在运行在不同机器上的进程之间发送消息。

话虽如此,这个问题似乎有点XY问题的味道,因为你似乎已经武断地将选择局限在了使用Python实现分布式程序的众多可能性中的仅仅两种。

编辑 我在这里的答案是不正确的,而且我无法删除一个被接受的答案,所以将其转换为 wiki,以防有人想要更正它。简短的故事是我匆忙中误读了文档。Python multiprocessing确实支持跨网络边界的进程间通信。与ZeroMQ的一个主要区别是,ZeroMQ被设计为平台无关的,因此您可以在不同平台上混合使用客户端/服务器代理,而Python多进程是一个包含在电池中的选项,如果客户端/服务器进程与Python耦合在一起。


谢谢。您能否提供有关“使用Python实现分布式程序的许多可能性”的更多信息? - user3262424
2
我是ZeroMQ的粉丝,所以我的意图并不是要让你远离它。我只是想明确(对于未来的开发者)在Python中进行进程间/分布式消息传递的方法不止两种。 - Joe Holloway
3
实际上,多进程模块可以用于在网络系统上创建进程间通信。这可以通过管理器来实现。 - Carlo Pires
从文档中可以看到,“multiprocessing”包提供了本地和远程并发功能... - Caleb Hattingh
说实话,我不确定当时写这个答案时我在吸什么或者是我读了什么文档让我认为它没有远程API。很奇怪。 - Joe Holloway
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接