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

Python 如何使用pyzmq发送带有PUB/SUB模式的dict?,python,python-3.x,zeromq,pyzmq,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.sets

我正在尝试发送一个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())
问题

  • 我似乎不知道如何设置
    send\u pyobj()
    的主题
  • 不用说,我在另一端没有收到任何东西。我用字符串和
    send_string()
    成功地实现了这一点,因此它肯定是连接在一起的。我做错了什么
  • 我可以拥有多个
    酒吧
    服务器吗?从而创造了一种多对多的模式,其他应用程序可以在这种模式下使用
  • 我可以拥有多个
    酒吧
    服务器吗
  • 是的,你可以 简单


  • 我在另一端没有收到任何东西。。。我做错了什么
  • 不要订阅
    “1”
    ,以防它从未出现 这一个原因是“没有接收任何东西”(除非它以
    “1”开头,显然它从来没有这样做过,因为负载是由
    套接字正确组装的。send_对象(…)
    ,并且从来没有
    “1”
    匹配字符串相似字节[0]的位置


  • …如何设置发送的主题
  • 你永远不知道 这应该使用其他方法设置,而不是猜测几个字节,“匹配”对象字节字符串表示的初始部分

    有史以来最简单的方法是在发送方“预加”受控值,如下所示:

    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
    dill
    在对象分解/遍历/恢复功能和安全警告方面的SER/DES策略都受到限制。这非常好。感谢您的详细响应。在本例中,我假设发送_-pyobj()不能在发布子模式中使用“raw”(因为这需要主题订阅?)。我很惊讶pyzmq没有“包装”这一点;我认为在发布子模式中传递python对象将是#1用例。事实上,在很多年之后(实际上比我想承认的要多)在使用基于ZeroMQ的智能分布式系统时,我从来没有使用过
    .send_string()
    ,越少使用
    .send_pyobj()
    特定于python的方法(附加伪装),因此任何“hitparade”中的“1”确实是一个主观衡量标准
    :o)
    无论如何,很高兴您发现这个答案很有趣,甚至“很棒”--这是一种堆垛溢出的文化,通过[+1]投票和接受有趣和有用的帖子来表达这一点,所以请随意这样做。