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

时间:2015-10-12 12:57:03

标签: python ipc zeromq pyzmq

我正在使用 pyzmq 库在同一台计算机上的两个python进程之间建立通信。看看ZMQ提供的可用消息模式,目前尚不清楚哪一种适合。
在我的情况下,两个进程都需要在一些随机时间内相互发送消息。基本上在不同时刻,每个进程都是客户端和服务器。下面有一些视觉描述。 enter image description here

要实现此模式,我使用了两个 ZMQ.PAIR 套接字。每当需要时, .bind() -sa套接字就可以接收, .connect() -s到另一个.send()
类似地,每个都有一个专门的线程来处理接收,这是阻塞。

然而,这个设计在我看来有点像一个延伸,我想知道是否有更自然的设置,适合这种情况?我也想象它一定很常见。 在当前的设计中,我也不喜欢这样一个事实,即当工艺完成时我需要手动清洁两个插座。

1 个答案:

答案 0 :(得分:1)

如果节点完全相同(至少,就他们如何为了通信目的而相互查看,即没有真正的“可靠”服务器到其他“瞬态”客户端)那么你有两个选择:

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

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

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

(B)只需选择一个节点作为“服务器”,将另一个节点选为“客户端”,bind()connect(),然后再对其进行处理等于

这听起来最像您正在寻找的东西。您不 过分关注哪一方bind()和哪一方connect()。此时听起来好像每次需要通信时都要打开和关闭连接。您应该考虑在您的流程生命周期中保持连接处于打开状态。您正在使用的PAIR套接字支持完全非结构化的通信,因此无论您指定哪个方面作为“服务器”以及您指定为“客户端”的哪一方,您都可以随意发送和接收任何方向。