ZeroMQ 清理 PULL 套接字 - 半关闭
Posted
技术标签:
【中文标题】ZeroMQ 清理 PULL 套接字 - 半关闭【英文标题】:ZeroMQ cleaning up PULL socket - half-close 【发布时间】:2012-09-10 17:55:37 【问题描述】:我的问题是试图半关闭一个 zmq 套接字。
简单来说,我在 Python 中有一对 PUSH/PULL 套接字。 PUSH 套接字永远不会停止发送,但 PULL 套接字应该能够通过以下方式自行清理:
-
停止接受队列中的任何其他消息
处理仍在队列中的消息
关闭套接字等
我不想以任何方式影响 PUSH 套接字,它可以继续累积自己的队列,直到另一个 PULL 套接字出现或可能已经存在。 LINGER 选项似乎不适用于 recv()(仅适用于 send())。
一种选择可能是在中间设置一个代理,将代理 PUSH 和接收器 PULL HWM 设置为零。然后代理的 PULL 会累积消息。但是,我宁愿不这样做。有没有其他办法?
【问题讨论】:
【参考方案1】:我相信您会混淆哪种套接字类型会将消息排队。根据zmq_socket 文档,PUSH 套接字会将其消息排队,但 PULL 套接字没有任何类型的排队机制。
所以你要求能够做的事情如下:
1) 停止 recv'ing 到 PULL 套接字 的任何附加消息。 2)关闭套接字等。
PUSH 套接字将继续自动将其消息“排队”,直到满足 HWM(此时它将阻塞并且不再排队任何消息)或 PULL 套接字出现并开始接收消息。
我认为您真正关心的情况是缓慢的 PULL 阅读器。您想在其中获取 PUSH 套接字中所有当前排队的消息(一次?)然后退出。这不是 zmq 的工作方式,您一次只收到一条消息。
要实现这种功能,您必须使用自己的队列包装 PULL 功能。您“不断”将消息拉入您的个人队列(在不同的线程中?),直到您想停止,然后处理这些消息并退出。
【讨论】:
以上是关于ZeroMQ 清理 PULL 套接字 - 半关闭的主要内容,如果未能解决你的问题,请参考以下文章