簡體   English   中英

訂閱服務器可以在ZeroMQ中將數據發送到發布服務器嗎

[英]Can Subscriber send data to Publisher in ZeroMQ

我正在使用ZeroMQ在兩個進程之間進行數據傳輸: sender.pyreceiver.py ,現在使用的通信模式是Publisher / Subscriber。 以下是我分別針對這兩個過程的代碼:

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 > 1000receiver.py ,它會自動終止兩者的運行腳本receiver.pysender.py 我想知道我是否能夠做到這一點。 我真的很感謝任何建議或想法:)

基於我對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

實際上可以做到,我不確定這是否是解決您問題的正確模式,但是無論如何:

您應該使用XSub和XPub,對於XSUB,您可以通過在套接字上調用send來發送訂閱,但是請確保為字節數組添加0x1字節前綴。 (0x0退訂)。 在您的情況下,它將是一個字節數組,設置為0x1。

在XPUB端,您需要接收所有消息並對其進行處理,如果以0x0或0x1為前綴的消息只是忽略它們,魔術就是以不同字節為前綴的消息。

從XSUB,當您想發送消息給發布者,而不是訂閱或取消訂閱時,只給它加上0x0或0x1以外的任何前綴。

因此,例如,當您收到高於1000的消息時,將消息從xsub發送到前綴為0x2的xpub。 在XPUB上,當您收到帶有2前綴的消息時,請終止套接字或您想要執行的任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM