【问题标题】:Can Subscriber send data to Publisher in ZeroMQ订阅者可以在 ZeroMQ 中向发布者发送数据吗
【发布时间】:2015-12-18 02:28:27
【问题描述】:

我正在使用 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 上做点什么:当在receiver.py 中收到data > 1000 时,它会自动终止receiver.pysender.py 的正在运行的脚本。我想知道我是否能够做到这一点。我真的很感谢任何建议或想法:)

【问题讨论】:

    标签: python zeromq publish-subscribe


    【解决方案1】:

    这实际上是可以做到的,我不确定这是否是您问题的正确模式,但无论如何:

    您应该使用 XSub 和 XPub,使用 XSUB 您可以通过在套接字上调用 send 来发送订阅,但请确保在字节数组前面加上 0x1 字节。 (0x0 取消订阅)。在您的情况下,它将是一个设置为 0x1 的字节数组。

    在 XPUB 端,您需要接收所有消息并对其进行处理,如果消息以 0x0 或 0x1 为前缀,则忽略它们,神奇的是消息以不同字节为前缀。

    当你想从 XSUB 向发布者发送不是订阅或取消订阅的消息时,只需在它前面加上不同于 0x0 或 0x1 的任何前缀。

    因此,例如,当您收到高于 1000 的消息时,将消息从 xsub 发送到带有 0x2 前缀的 xpub。在 XPUB 上,当您收到以 2 为前缀的消息时,终止套接字或您想做的任何事情。

    【讨论】:

      【解决方案2】:

      基于我对 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        相关资源
        最近更新 更多