订阅者可以在ZeroMQ中将数据发送到Publisher

时间:2015-12-18 02:28:28

标签: python zeromq publish-subscribe

我正在使用ZeroMQ在两个进程之间进行数据传输:sender.pyreceiver.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.pysender.py的正在运行的脚本。我想知道我是否能够做到这一点。我非常感谢任何建议或想法:)

2 个答案:

答案 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的消息时,会杀死套接字或你想做的任何事情。