如何在 pyzmq 中设置高水位线以阻止被淹没的收件人?

How to set high water mark to block on flooded recipient in pyzmq?

我对 PyZMQ 中的 HWM 行为感到困惑。我希望以下代码能够阻止

失败的例子

In [1]: import zmq
In [2]: context = zmq.Context()

In [3]: alice = context.socket(zmq.ROUTER)
In [4]: alice.set_hwm(1)
In [5]: alice.setsockopt(zmq.RCVHWM, 1)  # just to be sure
In [6]: alice.bind('ipc://alice')

In [7]: bob = context.socket(zmq.DEALER)
In [8]: bob.set_hwm(1)
In [9]: bob.connect('ipc://alice')

In [10]: bob.send(b'123')
In [11]: bob.send(b'123')  # This doesn't block
In [12]: bob.send(b'123')  # This doesn't block
In [13]: bob.send(b'123')  # This doesn't block

要么我不了解 HWM,要么我不了解如何在 Python 中使用它。

问题

当收件人被大量消息淹没时,如何在发件人端实现拦截?

您误解了 HWM 的工作原理。 HWM 只影响你设置它的套接字的操作。因此,当 alice 悄悄地 HWM, she'll start dropping messages 到达她时 - 她没有向 bob 提供任何反馈,因此 bob 继续发送他的消息。

高水位线的目的不是为消息流提供可靠性,只是保护套接字不崩溃由于 运行 内存不足。如果需要,处理应用程序中的消息可靠性是您的工作。