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

时间:2018-04-25 19:59:43

标签: python python-3.x zeromq 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. 的主题
  3. 毋庸置疑,我在另一端没有收到任何东西。我设法用字符串和send_string()来实现它,所以它肯定是连接的。我做错了什么?
  4. 我可以广播多个 PUB 服务器吗?从而创建一种多对多,其他应用程序可以进入流程?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 我可以广播多个 PUB 服务器吗?
  2.   

是的,你可以

易。

  
      
  1. 我在另一端没有收到任何东西......我做错了什么?
  2.   

请勿订阅 "1" 以及永远不会

的情况

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

  
      
  1. ...如何设置 "1"
  2. 的主题   

嗯,你永远不会知道

这应该使用其他方法设置,而不是猜几个字节,“匹配”对象字节字符串表示的初始部分。

最简单的方法是在发送方面“预先”控制一个值,如下所示:

send_pyobj()

使用多部分消息合成也是可能的,但在这里展示概念还需要更长的时间。

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 ):] ) ) pickle 对于对象分解/遍历/恢复功能的SER / DES策略都有限制,安全警告是众所周知,要小心。