是否可以在一个帖子中拥有发布者和订阅者?每当我做的时候
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_send
而socket_recv
导致地址已使用错误。)
我知道如何解决这个问题?我有多个客户端将消息写入pub-sub消息总线,然后我使用呼吸机示例将消息分发给工作人员,这些工作人员写回呼吸机,将结果发送回客户端(工作人员 - 呼吸机通信是一个不同的沟通)。也许有更好的沟通模式来处理这个......
答案 0 :(得分:0)
您几乎始终想要首先运行您想要使用的模式的现成示例,以确认所有内容似乎都处于正常工作状态。不幸的是我没有在pyzmq中看到任何现成的例子(我认为,你正在使用的绑定)和pub / sub在同一个线程中,但我已经看到并在其他语言中运行这样的例子所以它不是ZMQ的限制,应该可以在你的情况下使用。
有几件事你想看看。您的代码示例非常稀疏,任何人都无法诊断出发生了什么,但这里有一些建议:
socket_recv.setsockopt(zmq.SUBSCRIBE, "")
- 这将消除您未设置的可能性正确订阅。正如您所注意到的,您不能在同一地址bind()
两次,这是一个有用的记忆。您想将套接字对的一侧视为“服务器”(这实际上意味着常量元素)而将另一侧视为“客户端”(这实际上意味着不可靠的元素)......如果它们都是常量和可靠性,选择“拥有”或“发起”数据的那个(在pub / sub中,这将始终是发布者)并标记一个“服务器”......你想要{{1}在您的服务器上,以及您客户端上的bind()
。
所有这些......正如sberry所说,你建议的用例是双向通信,似乎不适合pub / sub。有很多例子可以在the guide中执行您想要执行的操作,具体请看reliable request/reply patterns。您的用例非常相似,您可能希望使用其中一个作为基础,并且在这些模式的描述中链接了python代码,这将有助于您了解哪些代码正在执行哪些操作。