我正在使用ZeroMQ在两个进程之间进行数据传输:sender.py
和receiver.py
,我现在使用的通信模式是发布者/订阅者。以下是我的两个进程的代码:
sender.py:
import zmq
context = zmq.Context()
publisher = context.socket(zmq.PUB)
# Set SNDHWM to not drop messages for slow subscribers
publisher.sndhwm = 1100000
publisher.bind("tcp://127.0.0.1:%s" % "5555")
for i in range(10000):
publisher.send(i)
receiver.py
import zmq
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.connect("tcp://127.0.0.1:%s" % "5555")
subscriber.setsockopt(zmq.SUBSCRIBE, "")
while(True):
data = subscriber.recv()
实际上,代码运行正常。目前,我想在receiver.py
上执行某些操作:在data > 1000
中收到receiver.py
后,它会自动终止receiver.py
和sender.py
的正在运行的脚本。我想知道我是否能够做到这一点。我非常感谢任何建议或想法:)
答案 0 :(得分:1)
基于我对ZeroMQ的非常短暂的经验。
简短回答:否
答案很长:您可以创建从SUB到PUB的其他逆流连接:
Node2
|--------> SUB
Node1 |<-------- PUB
PUB->|
SUB<-| Node3
|--------> SUB
|<-------- PUB
只需使用PUB到SUB可以通过两种配置传输数据的可能性:
一对多(一个PUB可与多个SUB对话)
多对一(许多PUB可以与一个SUB对话)
http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/pubsub.html
答案 1 :(得分:1)
实际上可以做到,我不确定这是你问题的正确模式,但无论如何:
您应该使用XSub和XPub,使用XSUB通过在套接字上调用send来发送订阅,但请确保在字节数组前加上0x1字节。 (0x0取消订阅)。在您的情况下,它将是一个字节数组设置为0x1。
在XPUB端,您需要接收所有消息并对其进行处理,如果前缀为0x0或0x1的消息只是忽略它们,那么魔术的前缀是不同的字节。
当您想要向不是订阅或取消订阅的发布者发送消息时,从XSUB发送消息时,请使用不同于0x0或0x1的任何内容作为前缀。
因此,例如,当您收到大于1000的消息时,会将消息从xsub发送到前缀为0x2的xpub。在XPUB上,当你收到一个前缀为2的消息时,会杀死套接字或你想做的任何事情。