如何暂停推送消息,直到套接字有带有 ZeroMQ 的客户端?

问题描述 投票:0回答:1

我使用 ZeroMQ 和 NetMQ 来允许一些 python 脚本和 Unity C# 脚本之间的双向通信。我用两个推挽插座来实现它,每路一个。这很好用。我现在遇到的问题是,当没有人拉取这些消息时,我想停止或暂停从 python 服务器发送消息。

我读到ZeroMQ不允许任何本机API调用来管理队列或类似的东西,但我可以尝试将ZMQ_SNDHWM设置为1之类的东西。问题是我不关心旧状态,推送套接字会如果达到高水位线,则将所有传出消息静音。

当 ZMQ_PUSH 套接字由于达到所有下游节点的高水位线而进入静音状态,或者根本没有下游节点时,则该套接字上的任何 zmq_send 操作都将阻塞,直到静音状态结束或至少一个下游节点可用于发送;消息不会被丢弃。有没有办法检测是否有人正在拉取消息或是否有人连接到套接字并以其他方式暂停或刷新队列?
https://libzmq.readthedocs.io/en/zeromq3-x/zmq_socket.html

提前致谢。

controls_socket = zmq.Context().socket(zmq.PUSH)
controls_socket.bind("tcp://127.0.0.1:5556")

while is_running:
  [...]
  controls_socket.send_string(control_commands)
sockets message-queue zeromq pyzmq netmq
1个回答
0
投票

您可以使用

ZMQ_CONFLATE
(zmq.CONFLATE) 套接字选项。这会忽略 HWM,并且仅将最后/最新发送/接收的消息保留在缓冲区中。

注意:

  • 调用前需要设置ZMQ_CONFLATE
    connect()/bind()
  • 不支持多部分消息。
© www.soinside.com 2019 - 2024. All rights reserved.