是否有可能在一个线程中有一个发布者和订阅者?不管我做什么
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()时,发送不起作用(在socket_send上使用bind(),socket_recv会导致一个已经使用的地址错误)。
知道我该怎么解决这个问题吗?我有一个多个客户端将消息写入pub- sends,然后我使用通风机示例将消息分发给工人,然后这些工作人员将消息写回通风机,后者将结果发回给客户(工人-通风机通信是一种不同的通信)。也许有更好的沟通方式来处理这件事..。
发布于 2014-12-29 15:21:34
您几乎总是希望运行一个准备就绪的模式示例,您希望首先使用它来确认一切似乎都正常工作。不幸的是,我没有在pyzmq中看到任何现成的示例(我假设使用的是绑定)和pub/sub都在同一个线程中,但是我在其他语言中看到并运行了这样的示例,所以这不是ZMQ的一个限制,在您的情况下应该是可能的。
有几件事你会想看看。您的代码示例非常稀疏,任何人都无法诊断其中发生了什么,但以下是一些建议:
socket_recv.setsockopt(zmq.SUBSCRIBE, "") --这将消除您没有正确设置订阅的可能性。正如您注意到的,您不能在同一个地址上使用两次bind(),这是非常有用的。您希望将套接字对的一方看作是“服务器”(实际上意味着常量元素),而另一方则认为是“客户端”(这实际上意味着不可靠的元素).如果它们都是不变的,并且都是可靠的,那么选择一个“拥有”或“原始”数据(在pub/sub中,这将永远是发行者),并将其标记为“服务器”.您希望在服务器上使用bind(),在客户端上使用connect()。
所有的话..。正如sberry所指出的,您提议的用例是双向通信,这似乎不适合pub/sub。在导游中执行您想要做的事情的例子很多,特别是查看可靠的请求/答复模式。您的用例非常类似,您可能希望使用其中的一个作为基础,并且在这些模式的描述中都有链接的python代码,这些代码将帮助您理解哪些代码正在执行什么任务。
https://stackoverflow.com/questions/27630382
复制相似问题