如何在python中使用有限的ZMQ(ZeroMQ-PyZMQ)队列缓冲区大小?

时间:2018-01-16 10:15:42

标签: python zeromq pyzmq

我在 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(已配置发送/接收高水位线)。

2 个答案:

答案 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.SNDBUFzmq.RCVBUF选项,我们可以设置ZMQ缓冲区大小的限制。 (More complete and an example

答案 1 :(得分:0)

要设置队列/缓冲区大小,您需要通过套接字选项设置高水位标记

B::B()