[英]ZeroMQ publishing subscriber
是否可以在一个线程中拥有发布者和订阅者? 每当我做
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
上使用bind()
会导致地址已使用的错误)。
关于如何解决这个问题的任何想法吗? 我有多个客户端将消息写入pub-sub消息总线,然后我使用呼吸机示例将消息分发给工作人员,然后这些工作人员写回呼吸机,然后将结果发送回客户端(工作人员-呼吸机通信是不同的沟通)。 也许有更好的沟通方式可以解决这个问题...
您几乎总是想运行一个您想首先使用的模式的现成示例,只是为了确认一切似乎都正常。 不幸的是,我在pyzmq(我假设您正在使用的绑定)中都没有在同一线程中使用pub / sub看到任何现成的示例,但是我已经看到并以其他语言运行了这样的示例,所以没有ZMQ的限制,在您的情况下应该是可能的。
您需要看几件事。 您的代码示例非常稀疏,任何人都无法诊断由此产生的后果,但是这里有一些建议:
socket_recv.setsockopt(zmq.SUBSCRIBE, "")
-这将消除您未正确设置订阅的可能性。 正如您所注意到的,您不能在同一地址上两次bind()
,请记住这一点。 您想将套接字对的一侧视为“服务器”(这实际上意味着常量元素),而将另一侧视为“客户端”(这实际上意味着不稳定的元素)……如果它们两者都一样恒定且可靠。选择一个“拥有”或“创建”数据的对象(在pub / sub中,它始终是发布者),然后将其中一个标记为“服务器” ...您要在其上bind()
您的服务器,以及客户端上的connect()
。
所有这些……正如sberry所指出的那样,您建议的用例是双向通信,似乎不适合pub / sub。 这样做有你想在做什么的例子很多指导 ,具体看可靠的请求/应答模式 。 您的用例非常相似,以至于您可能希望使用其中之一作为基础,并且在这些模式的描述中都链接了python代码,这将有助于您了解哪个代码在做什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.