使用 PyZMQ pub/sub 套接字仅在订阅者中保留最新的多部分消息

Only keep latest multipart message in subscriber with PyZMQ pub/sub socket

我正在尝试使用 ZMQ pub/sub 模型发送图像 numpy 数组。我关注了documentation here

但是,我意识到我的订阅者中会累积帧,因为由于在订阅者端完成的操作,订阅者将无法以发布者发送的速率处理帧对于框架。

由于文档使用多部分消息发送图像数组,我无法在 set_sockopt 上使用 CONFLATE 选项,因为这使得它只保留多部分的一部分。

我的问题:有没有办法让订阅者只保留最新的多部分消息?

您是否正在寻找 zmq.CONFLATE 选项 ("Last Message Only")?

订户端是这样的:

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.

Relevant post

Learn more

最后我通过反复订阅和取消订阅 ZMQ 套接字解决了这个问题。

# This is run every time the subscriber receive function is called
socket.setsockopt(zmq.SUBSCRIBE, '')
md = socket.recv_json()
msg = socket.recv()
socket.setsockopt(zmq.UNSUBSCRIBE, '')

本质上,我这样做是为了让我的订户套接字不关心除了收到的一条消息之外的其他消息,直到它下次尝试获取消息为止。

我认为这不是解决此问题的最佳方法,因为重复订阅和取消订阅会产生成本。希望可能有更好的方法来做到这一点,但到目前为止我还没有找到它。