Python 如何使用pyzmq发送带有PUB/SUB模式的dict?
我正在尝试发送一个python字典,使用如下内容: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
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]投票和接受有趣和有用的帖子来表达这一点,所以请随意这样做。