如何使用 pyzmq 发送带有 PUB/SUB 模式的字典?

How do I send a dict with the PUB/SUB pattern using pyzmq?

我正在尝试发送 python 字典,使用类似的东西:

import zmq
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port
socket.send_pyobj({'hello':'world'})

并使用以下方式接收:

socket.connect ("tcp://localhost:%s" % port)
topicfilter = "1"

socket.setsockopt_string(zmq.SUBSCRIBE, topicfilter)

while True:
    print(socket.recv_pyobj())

问题:

  1. 我似乎不知道如何为 send_pyobj() 设置主题。
  2. 不用说,我在另一端没有收到任何东西。我设法让它与字符串和 send_string() 一起运行,所以它肯定是连接的。我做错了什么?
  3. 我可以让多个PUB服务器广播吗?从而创建一种多对多的方式,其他应用程序可以参与其中?
  1. Can I have many PUB servers broadcasting?

是的,你可以

简单。


  1. I don't receive anything on the other end... What am I doing wrong?

不要订阅 "1" 以防万一它永远不会出现

这个单一的原因支持“没有收到任何东西”(除非它以 "1" 开头,但它显然从来没有这样做过,因为有效载荷是由socket.send_object( ... ) 并且从来没有 "1" 匹配类似字符串的字节 [0] 的位置。


  1. ... how to set the topic for send_pyobj()?

嗯,你永远不知道

这应该使用其他方式设置,而不是猜测几个字节,“匹配”object-byte-string-representation 的初始部分。

最简单的方法是像这样在发送端“添加”一个受控值:

import dill as pickle

aConstantNbytesPUB_TOPIC_FILTER_PREFIX = "{UUID:0000-0000-0000-1111-2222}"

socket.send(aConstantNbytesPUB_TOPIC_FILTER_PREFIX + pickle.dumps(anObjectToSEND))

#...

aMSG = socket.recv()
print(pickle.loads(aMSG[len(aConstantNbytesPUB_TOPIC_FILTER_PREFIX) :]))

使用多部分消息组合也是可能的,但这里要用更长的时间来演示这个概念。

pickledill都在SER/DES-strategies对象分解/众所周知,遍历/恢复功能和安全警告要小心处理。