【问题标题】:How do I send a dict with the PUB/SUB pattern using pyzmq?如何使用 pyzmq 发送带有 PUB/SUB 模式的字典?
【发布时间】:2018-10-06 09:52:09
【问题描述】:

我正在尝试发送 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 服务器广播吗?从而创建了一种多对多的方式,其他应用可以参与其中吗?

【问题讨论】:

    标签: python python-3.x zeromq pyzmq


    【解决方案1】:
    1. 我可以有多台PUB服务器广播吗?

    是的,你可以

    简单。


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

    不要订阅 "1",如果它永远不会出现

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


    1. ...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 ):]
                         )
           )
    

    也可以使用多部分消息组合,但在这里演示这个概念的时间要长一些。

    pickledill 的 SER/DES 策略都受限于对象分解/遍历/恢复功能和众所周知的安全警告小心点。

    【讨论】:

    • 这很棒。感谢您的详细回复。在这种情况下,我假设 send_pyobj() 不能在 pub-sub 模式中“原始”使用(因为这需要主题订阅?)。我很惊讶 pyzmq 没有“包装”这个;我认为以 pub-sub 模式传递 python 对象将是#1 用例。
    • 好吧,在使用了基于 ZeroMQ 的智能分布式系统多年(实际上比我愿意承认的更多)之后,我从未使用过.send_string(),少了.send_pyobj() python 特定方法(附加伪装),所以在任何“hitparade”中排名第一确实是一个主观衡量标准:o)无论如何,很高兴你发现答案很有趣,甚至是“great”——这是一种 StackOverflow 文化,将其表达为 [+1] 投票并接受有趣和有用的帖子——所以请随意这样做。
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2021-01-27
    • 2019-05-17
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2018-03-24
    • 2019-12-04
    相关资源
    最近更新 更多