ZeroMQ High Water Mark не работает - PullRequest
9 голосов
/ 11 ноября 2011

Когда я прочитал «Durable Subscribeers and High-Water Marks» в руководстве по zmq, он сказал: «HWM заставляет ØMQ отбрасывать сообщения, которые он не может поместить в очередь», но при запуске примера сообщения не терялись. Нажмите Ctrl + C, чтобы завершить durasub.py, а затем продолжить его.

пример из zmq на python. Другие языки такие же.

durasub.py

import zmq                                              
import time                                             

context = zmq.Context()                                 


subscriber = context.socket(zmq.SUB)                    
subscriber.setsockopt(zmq.IDENTITY, "Hello")            
subscriber.setsockopt(zmq.SUBSCRIBE, "")                
subscriber.connect("tcp://localhost:5565")              


sync = context.socket(zmq.PUSH)                         
sync.connect("tcp://localhost:5564")                    
sync.send("")                                           


while True:                                             
    data = subscriber.recv()                            
    print data                                          
    if data == "END":                                   
        break                                           

durapub.py

import zmq                                        
import time                                       

context = zmq.Context()                           


sync = context.socket(zmq.PULL)                   
sync.bind("tcp://*:5564")                         

publisher = context.socket(zmq.PUB)               
publisher.bind("tcp://*:5565")                    

publisher.setsockopt(zmq.HWM, 2)                  

sync_request = sync.recv()                        

for n in xrange(10):                              
    msg = "Update %d" % n                         
    publisher.send(msg)                           
    time.sleep(1)                                 

publisher.send("END")                             

1 Ответ

16 голосов
/ 05 мая 2012

Предложение, приведенное выше, действительно, но не решает проблему в этом конкретном коде.

Настоящая проблема здесь в том, что в durapub.py вы звоните publisher.setsockopt(zmq.HWM, 2) ПОСЛЕ вызова publisher.bind. Вам следует позвонить setsockopt ДО bind или connect.

Пожалуйста, обратитесь к 0MQ API документации для setsockopt :

Внимание: все параметры, за исключением ZMQ_SUBSCRIBE, ZMQ_UNSUBSCRIBE и ZMQ_LINGER, вступают в силу только для последующих привязок / соединений сокетов.

...