我正在使用pyzmq库在同一台计算机上的两个python进程之间建立通信。从ZMQ提供的可用消息传递模式来看,尚不清楚哪种模式合适。在我的情况下,两个进程都需要在某个随机时间相互独立地发送消息。基本上在各个时刻,每个进程既是客户端又是服务器。下面是一些视觉描述。
python - 适用于通信过程的Zmq消息模式-LMLPHP

为了实现此模式,我使用了两个ZMQ.PAIR套接字。每个进程.bind() -s是一个要在其上接收的套接字,而.connect() -s是另一个要在.send()上的套接字,同样,每个进程都有专用的线程来处理接收,这是阻塞的。

但是,在我看来,这种设计有点像伸展,我想知道是否存在一种更自然且更适合这种情况的设置?我还想像它一定很常见。
在当前的设计中,我也不喜欢在处理结束后需要手动清洁两个插槽的事实。

最佳答案

如果节点在字面上是相同的(至少就它们出于通信目的而言如何相互查看,即对于其他“临时”客户端而言,没有真正的“可靠”服务器),那么您有两种选择:

(A)旋转两对套接字,一对将一个节点视为服务器,另一对视为客户端,另一对则颠倒该关系。

如果通信在节点之间遵循严格的模式(例如一个节点启动通信,并且在该特定对话结束之前会发生特定的来回交互。这允许每个节点独立发起通信并保持自己的通信节奏,而不会与其他节点发起的“串扰”混淆。

如果某天可能有两个以上的节点,以创建星型拓扑,其中每个节点可以直接与其他每个节点进行通信,则这也更合适。它可以合理地使用多少个节点是有限制的,超过此限制,您将需要实现某种中央代理。

(B)只需适当地选择一个节点作为“服务器”,另一个节点作为“客户端”,然后bind()connect(),然后将它们等同即可。

这听起来像您要寻找的东西。您不必过于担心bind()的哪一侧和connect()的哪一侧。此刻听起来好像您每次需要进行通信时都在打开和关闭连接。您应该考虑在过程的整个生命周期中保持开放状态。您使用的PAIR套接字完全支持非结构化通信,因此无论您指定哪一侧为“服务器”,以及哪一侧为“客户端”,都可以自由地从任一方向进行发送和接收。

关于python - 适用于通信过程的Zmq消息模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33081725/

10-12 18:36