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'ingPULL 套接字 的任何附加消息。 2)关闭套接字等。

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

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

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

【讨论】:

以上是关于ZeroMQ 清理 PULL 套接字 - 半关闭的主要内容,如果未能解决你的问题,请参考以下文章

zeroMq中pub-sub和push-pull模式的区别

ZeroMQ/ZMQ 推/拉模式的用处

关于 ZeroMQ 并使用替代存储来存储消息

如何在 ZeroMQ 的 REQ-REP 模式中获取请求者的公共 IP?

ZeroMQ使用学习记录(转)

ZeroMQ-Push/Pull