ZeroMQ高水位标记不起作用

fai*_*ker 9 zeromq

当我在zmq指南中阅读"持久用户和高水位标记"时,它说"HWM导致ØMQ丢弃它无法放入队列的消息",但是当我运行该示例时没有消息丢失.按ctrl + c终止durasub.py,然后继续.

来自python中的zmq的示例.其他语言是相同的.

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                                           
Run Code Online (Sandbox Code Playgroud)

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")                             
Run Code Online (Sandbox Code Playgroud)

von*_*ond 16

上面的建议是有效的,但没有正确解决此特定代码中的问题.

这里真正的问题是durapub.py你打电话给publisher.setsockopt(zmq.HWM, 2)AFTER publisher.bind.你应该打电话给setsockoptBEFORE bindconnect.

有关setsockopt的信息,请参阅0MQ API文档:

注意:除ZMQ_SUBSCRIBE,ZMQ_UNSUBSCRIBE和ZMQ_LINGER外,所有选项仅对后续套接字绑定/连接生效.