适用于通信进程的 Zmq 消息模式

Suitable Zmq messsage pattern for communicating processes

我正在使用 pyzmq 库在同一台机器上的两个 python 进程之间建立通信。查看 ZMQ 提供的可用消息传递模式,并不清楚哪一个是合适的。
在我的例子中,两个进程都需要在某个随机时间相互独立地发送消息。基本上在不同的时刻,每个进程既是客户端又是服务器。下面是一些视觉描述。

为了实现这种模式,我使用了两个 ZMQ.PAIR 套接字。每个进程 .bind()-s 一个 socket 接收到它并且 .connect()-s 到另一个到 .send() 每当需要的时候。
同样每个都有一个专门的线程来处理接收,这是阻塞的。

不过这样的设计我觉得有点牵强,不知道有没有更自然更适合这种场景的设置?我也在想象它一定很常见。 在当前的设计中,我也不喜欢在进程完成时需要手动清理两个套接字的事实。

如果节点在字面上是相同的(至少,就它们如何看待彼此进行通信而言,即没有真正的 "reliable" 服务器到其他 "transient" 客户端)那么你有两个选项:

(A) 启动两对套接字,一对将一个节点视为服务器,另一对将其视为客户端,另一对则颠倒这种关系。

如果通信遵循节点之间的严格模式,这可能是合适的,例如一个节点发起通信,并且在该特定对话结束之前发生特定的来回。这允许每个节点独立发起通信并保持自己的通信节奏,而不会与其他节点发起的"crosstalk"混淆。

如果有一天可能有两个以上的节点,这也更合适,以创建一个星形拓扑,其中每个节点都可以直接与其他每个节点通信。这可以合理地与多少节点一起工作是有限制的,超过这个限制你会想要实现某种中央代理。

(B) 只需选择一个节点作为 "server",另一个节点适当地作为 "client"、bind()connect() ,然后将它们视为相等

这听起来很像您要查找的内容。你不需要需要过分关注哪一边bind()和哪一边connect()。目前,听起来好像您每次需要通信时都在打开和关闭连接。您应该考虑在流程的整个生命周期内保持连接打开。您正在使用的 PAIR 套接字支持完全非结构化的通信,因此无论您将哪一侧指定为您的 "server" 以及您将哪一侧指定为您的 "client".