如何使用 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())
问题:
- 我似乎不知道如何为
send_pyobj()
设置主题。
- 不用说,我在另一端没有收到任何东西。我设法让它与字符串和
send_string()
一起运行,所以它肯定是连接的。我做错了什么?
- 我可以让多个
PUB
服务器广播吗?从而创建一种多对多的方式,其他应用程序可以参与其中?
- Can I have many
PUB
servers broadcasting?
是的,你可以
简单。
- I don't receive anything on the other end... What am I doing wrong?
不要订阅 "1"
以防万一它永远不会出现
这个单一的原因支持“没有收到任何东西”(除非它以 "1"
开头,但它显然从来没有这样做过,因为有效载荷是由socket.send_object( ... )
并且从来没有 "1"
匹配类似字符串的字节 [0] 的位置。
- ... 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) :]))
使用多部分消息组合也是可能的,但这里要用更长的时间来演示这个概念。
pickle
和dill
都在SER/DES-strategies对象分解/众所周知,遍历/恢复功能和安全警告要小心处理。
我正在尝试发送 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_pyobj()
设置主题。 - 不用说,我在另一端没有收到任何东西。我设法让它与字符串和
send_string()
一起运行,所以它肯定是连接的。我做错了什么? - 我可以让多个
PUB
服务器广播吗?从而创建一种多对多的方式,其他应用程序可以参与其中?
- Can I have many
PUB
servers broadcasting?
是的,你可以
简单。
- I don't receive anything on the other end... What am I doing wrong?
不要订阅 "1"
以防万一它永远不会出现
这个单一的原因支持“没有收到任何东西”(除非它以 "1"
开头,但它显然从来没有这样做过,因为有效载荷是由socket.send_object( ... )
并且从来没有 "1"
匹配类似字符串的字节 [0] 的位置。
- ... 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) :]))
使用多部分消息组合也是可能的,但这里要用更长的时间来演示这个概念。
pickle
和dill
都在SER/DES-strategies对象分解/众所周知,遍历/恢复功能和安全警告要小心处理。