【发布时间】:2022-03-09 15:59:21
【问题描述】:
我正在使用带有 pub/sub 模式的 pyzmq 库。我有 一些使用 .connect() 方法的快速 ZMQ 发布者 和使用 .bind() 方法的较慢的 ZMQ 订阅者。
几分钟后,我的订阅者收到了发布者发布的旧数据——由于 ZMQ 缓冲区。
我的问题:
有没有办法管理ZMQ队列缓冲区大小?(设置有限缓冲区)
[注意]:
- 我不想使用 ZMQ PUSH/PULL。
- 我读过这篇文章,但这种方法只清除缓冲区:clear ZMQ buffer
- 我也尝试了
high watermark选项,但没有成功:
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) # A speed reducer like.
data = socket.recv()
print(data)
尽管有这些选项(通过配置的send/receive high watermark),队列大小仍然大于 10。
【问题讨论】:
-
欢迎@BenyaminJafari。先生,您能否扩展一点您的目标定义?什么是 { PASS | FAIL }-criteria 用于审核是否确实实现了设定目标的任何方法 - 即对于“一种管理 ZMQ 队列缓冲区大小的方法”?最好仅使用强制部分,将其表述为 MUST_HAVE:-feature 列表(如果确实某些此类愿望要求一些自愿附加组件,则使用 NICE_TO_HAVE:(s)),这很公平,不是吗?
标签: python sockets zeromq pyzmq