ZeroMQ发布订阅者

时间:2014-12-24 01:37:57

标签: python zeromq distributed-computing

是否可以在一个帖子中拥有发布者和订阅者?每当我做的时候

socket_send = context.socket(zmq.PUB)
socket_send.bind("tcp://127.0.0.1:5559")

socket_recv = context.socket(zmq.SUB)
socket_recv.connect("tcp://127.0.0.1:5559")
socket_recv.setsockopt(zmq.SUBSCRIBE, "id1")

订阅不起作用(即消息不会到达)。当我使用socket_recv.bind()时,发送无效(在bind()上使用socket_sendsocket_recv导致地址已使用错误。)

我知道如何解决这个问题?我有多个客户端将消息写入pub-sub消息总线,然后我使用呼吸机示例将消息分发给工作人员,这些工作人员写回呼吸机,将结果发送回客户端(工作人员 - 呼吸机通信是一个不同的沟通)。也许有更好的沟通模式来处理这个......

1 个答案:

答案 0 :(得分:0)

您几乎始终想要首先运行您想要使用的模式的现成示例,以确认所有内容似乎都处于正常工作状态。不幸的是我没有在pyzmq中看到任何现成的例子(我认为,你正在使用的绑定)和pub / sub在同一个线程中,但我已经看到并在其他语言中运行这样的例子所以它不是ZMQ的限制,应该可以在你的情况下使用。

有几件事你想看看。您的代码示例非常稀疏,任何人都无法诊断出发生了什么,但这里有一些建议:

  • 在尝试订阅特定主题(在您的情况下为“id1”)之前,请尝试订阅所有内容socket_recv.setsockopt(zmq.SUBSCRIBE, "") - 这将消除您未设置的可能性正确订阅。
  • 同样,当你订阅“id1”时,请确保你的消息是以字符串“id1”开头的单帧消息,或者它是一个多帧消息以“id1”作为第一帧。
  • 我假设所有这些都是在同步上下文中运行,这意味着您的订阅者应该在转到下一行之前完成连接,但只要确保这是真的...如果您应该在开始之前发布消息订阅者已完成连接,该邮件将丢失。

正如您所注意到的,您不能在同一地址bind()两次,这是一个有用的记忆。您想将套接字对的一侧视为“服务器”(这实际上意味着常量元素)而将另一侧视为“客户端”(这实际上意味着不可靠的元素)......如果它们都是常量和可靠性,选择“拥有”或“发起”数据的那个(在pub / sub中,这将始终是发布者)并标记一个“服务器”......你想要{{1}在您的服务器上,以及您客户端上的bind()

所有这些......正如sberry所说,你建议的用例是双向通信,似乎不适合pub / sub。有很多例子可以在the guide中执行您想要执行的操作,具体请看reliable request/reply patterns。您的用例非常相似,您可能希望使用其中一个作为基础,并且在这些模式的描述中链接了python代码,这将有助于您了解哪些代码正在执行哪些操作。