首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZeroMQ发布用户

ZeroMQ发布用户
EN

Stack Overflow用户
提问于 2014-12-24 01:37:57
回答 1查看 1.2K关注 0票数 0

是否有可能在一个线程中有一个发布者和订阅者?不管我做什么

代码语言:javascript
复制
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,然后我使用通风机示例将消息分发给工人,然后这些工作人员将消息写回通风机,后者将结果发回给客户(工人-通风机通信是一种不同的通信)。也许有更好的沟通方式来处理这件事..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-29 15:21:34

您几乎总是希望运行一个准备就绪的模式示例,您希望首先使用它来确认一切似乎都正常工作。不幸的是,我没有在pyzmq中看到任何现成的示例(我假设使用的是绑定)和pub/sub都在同一个线程中,但是我在其他语言中看到并运行了这样的示例,所以这不是ZMQ的一个限制,在您的情况下应该是可能的。

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

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

正如您注意到的,您不能在同一个地址上使用两次bind(),这是非常有用的。您希望将套接字对的一方看作是“服务器”(实际上意味着常量元素),而另一方则认为是“客户端”(这实际上意味着不可靠的元素).如果它们都是不变的,并且都是可靠的,那么选择一个“拥有”或“原始”数据(在pub/sub中,这将永远是发行者),并将其标记为“服务器”.您希望在服务器上使用bind(),在客户端上使用connect()

所有的话..。正如sberry所指出的,您提议的用例是双向通信,这似乎不适合pub/sub。在导游中执行您想要做的事情的例子很多,特别是查看可靠的请求/答复模式。您的用例非常类似,您可能希望使用其中的一个作为基础,并且在这些模式的描述中都有链接的python代码,这些代码将帮助您理解哪些代码正在执行什么任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27630382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档