我在 python 中使用pyzmq
库和 pub / sub 。
我通过.connect()
方法脚本一些快速ZMQ发布者,通过.bind()
方法脚本一个较慢的ZMQ订阅者。
然后几分钟后,我的订阅者从发布者那里获得旧的发布数据(到期的ZMQ缓冲区)。
我的问题:是否有办法管理 ZMQ队列缓冲区大小?(设置有限缓冲区)
注意:我不想使用ZMQ PUSH / PULL。
注意:我已阅读此帖,但此方法仅清除缓冲区:clear ZMQ buffer
注意:我也尝试使用高水位线选项,但它没有效果:
socket.setsockopt(zmq.RCVHWM, 10) # not working socket.setsockopt(zmq.SNDHWM, 10) # not working
出版商:
import zmq
import time
port = "5556"
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
socket.setsockopt(zmq.SNDHWM, 10) # not working
while True:
data = time.time()
print("%d" % data)
socket.send("%d" % data)
time.sleep(1)
订户:
import zmq
import time
port = "5556"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:%s" % port)
socket.setsockopt(zmq.SUBSCRIBE, '')
socket.setsockopt(zmq.RCVHWM, 10) # not working
while 1:
time.sleep(2)
data = socket.recv()
print data
即使使用这些选项,队列大小仍然超过10(已配置发送/接收高水位线)。
答案 0 :(得分:1)
我找到了一种获取" 仅限上一条消息的方式" ZMQ
订阅套接字中的选项(使用CONFLATE
选项)。
但首先您应该在连接之前设置CONFLATE
选项:
import zmq
import time
port = "5556"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.setsockopt(zmq.SUBSCRIBE, '')
socket.setsockopt(zmq.CONFLATE, 1) # last msg only.
socket.connect("tcp://localhost:%s" % port) # must be placed after above options.
while 1:
time.sleep(2)
data = socket.recv()
print data
换句话说,我删除了用户代码中的所有缓冲队列。
[其他]:
使用zmq.SNDBUF
和zmq.RCVBUF
选项,我们可以设置ZMQ缓冲区大小的限制。 (More complete and an example)
答案 1 :(得分:0)
要设置队列/缓冲区大小,您需要通过套接字选项设置高水位标记
B::B()