3

我的问题是试图半关闭一个 zmq 套接字。

简单来说,我在 Python 中有一对 PUSH/PULL 套接字。
PUSH 套接字永远不会停止发送,但 PULL 套接字应该能够通过以下方式自行清理:

  1. 停止接受队列中的任何其他消息
  2. 处理仍在队列中的消息
  3. 关闭插座等。

我不想以任何方式影响 PUSH 套接字,它可以继续累积自己的队列,直到另一个 PULL 套接字出现或可能已经存在。LINGER 选项似乎不适用于 recv()(仅适用于 send())。

一种选择可能是在中间有一个代理,代理 PUSH 和接收器 PULL HWM 设置为零。然后代理的 PULL 会累积消息。但是,我宁愿不这样做。还有其他方法吗?

4

1 回答 1

0

我相信您会混淆哪种套接字类型会将消息排队。根据zmq_socket文档,PUSH 套接字将对其消息进行排队,但 PULL 套接字没有任何类型的排队机制。

因此,您要求能够做的事情如下:

1) 停止向PULL套接字接收任何其他消息。2)关闭插座等。

PUSH 套接字将继续自动将其消息“排队”,直到满足 HWM(然后它将阻塞并且不再排队任何消息)或 PULL 套接字出现并开始接收消息。

我认为您真正关心的案例是缓慢的 PULL 阅读器。您想在其中获取 PUSH 套接字中所有当前排队的消息(一次?)然后退出。这不是 zmq 的工作方式,您一次收到一条消息。

要实现这种类型的东西,您必须用自己的队列包装 PULL 功能。您“不断”将消息拉入您的个人队列(在不同的线程中?),直到您想停止,然后处理这些消息并退出。

于 2012-09-12T18:58:29.493 回答