【问题标题】:Why ZeroMQ PUB/SUB example in python does not receive any messages?为什么 python 中的 ZeroMQ PUB/SUB 示例没有收到任何消息?
【发布时间】:2017-12-14 23:53:21
【问题描述】:

我试图在指南中的 python(wuserverwuclient)中运行 ZeroMQ PUB/SUB-archetype 示例,但它对我不起作用。

我在 Ubuntu 虚拟机上进行了尝试。我在ubuntu 16.10(在VM中)上运行python3.6.1pyzmq.__version__ == 16.0.3。如果我将套接字的原型从PUB/SUB 更改为PUSH/PULL,客户端将按预期开始接收消息。

  • 我错过了什么?
  • 我该怎么做才能找出这种意外行为的原因?

我在PUB-server 之前启动了一个SUB-client(我也尝试过相反的方法)但SUB 从来没有收到任何消息。

【问题讨论】:

  • 我无法重现此行为。我刚刚尝试使用 python 3.6.2(使用 pyzmq 16.0.3)和直接来自您提供的链接的代码,它可以正常工作。
  • 我认为这些示例必须有效。我缺少的是如何找出我的设置有什么问题。鉴于 pull/push 有效,什么可以阻止 sub/pub 工作?
  • 我知道ubuntu 16.10有python 3.5.2。你从哪里得到 3.6.1?我想知道我是否可以尝试复制您的环境。

标签: python zeromq


【解决方案1】:

该示例实际上是开箱即用的。我注释掉了socket.setsockopt_string(zmq.SUBSCRIBE, zip_filter),而不是为zip_filter 提供一个空字符串,这不允许套接字接收任何内容。我没有意识到setsockopt_string电话的重要性。

【讨论】:

  • 很高兴你知道了!
  • 正是 StackOverflow 坚持提供 MCVE 公式化代码的原因。 你误导了其他支持问题发现过程的社区成员,因为您有 (a) 声明“我认为这些示例必须有效”,这只是微弱地引用了外部发布的通用代码,但是(b) 确认了“我注释掉了...”部分代码,这主要改变了代码执行的性质。这是不可接受的做法。 接下来,如果请 StackOverflow 成员提供帮助,请仅发布完整详细的 MCVE 代码,好吗?
【解决方案2】:

让我们从第二个nd 问题开始:抱歉,这是预期的行为

ZeroMQ 原型被定义为代表某种行为。如前所述,PUSH-archetype AccessPoint 将每条消息“通过”所有迄今为止设置的通信渠道,PULL-er AccessPoint 将任何已经到达的东西拉到“它的手中”,PUB- lisher AccessPoint 发布,SUB-scriber AccessPoint 订阅,以便仅接收与其主题过滤器匹配的消息,但不接收任何其他消息。

看起来很清楚,这样的 Archetype“规范”有助于构建 ZeroMQ 智能消息传递/信令基础架构,以便我们在 架构中轻松使用。

为什么它没有发送一条消息?简单地说,它不能交付。

按照定义,刚刚实例化的 SUB 侧 AccessPoint 对象实际上是零机会知道哪些消息是正确的,因此它们应该是“已发送”以及哪些消息未发送。

如果没有这个初始知识,ZeroMQ 设计者的主要选择是要么原型策略一致,并让PUB-side AccessNode 将所有.send()-acquired 获取的消息分发给那些SUB-side AccessNode(s),已经明确要求接收任何此类,直接通过zmq.SUBSCRIBE-mechanicsPUB发送的所有内容发送到所有迄今为止联合国-决定SUB-s.

前者是来自 ZeroMQ 作者的一致且专业的设计步骤。
后者实际上意味着违反 ZeroMQ 自己的 RFC 规范。

后一种选择就像如果一个人刚搬到一个新公寓,那么你几乎不会期望从第二天早上开始,所有的报纸和杂志都会出现在他的新邮箱中,不是吗?但是,如果您订阅了《波士顿环球报》,那么第二天早上,新版本就会出现在门口,因为它将一直存在,直到您取消订阅或报纸破产或缺少纸卷而导致印刷厂无法交付在适当的时候和时尚或 Big Dig 隧道中的交通堵塞可能会在某一天给所有或只是本地交付造成麻烦。

这一切都是自然的,并且与原型政策兼容。

间奏曲:
技术纯粹主义者会在这里反对,早期的 API 版本(直到 v3.2+)实际上确实在技术上将所有消息有效负载从PUB 传输到所有SUB-s,因为它简化了PUB-side 工作负载信封,但增加了传输类数据流和SUB-side 资源/延迟主题过滤器处理。然而,所有这些都隐藏在用户代码中,就在抽象的 API 范围内。因此,除了需要适当地扩展资源之外,这对用户来说是透明的。最近的 API 版本恢复了主题过滤器处理器的角色,并让这现在发生在 PUB 端。尽管如此,在这两种情况下,ZeroMQ RFC 规范策略都是以这样的方式实现的,SUB-side 永远不会传递(通过.recv()-interface)与有效的显式@987654342 不匹配的单个消息@-side 订阅

在所有情况下,SUB-side 尚未明确设置任何 zmq.SUBSCRIBE-instructed 主题过滤器,它不能也不会提供任何东西(这是自然且完全一致的使用为 SUB-type AccessPoint 定义的 ZeroMQ RFC Archetype-policy。

第一个st问题的答案:最好的下一步:

至少,请始终阅读 ZeroMQ API 文档,其中所有细节都经过专业说明 - 这样至少,人们可以初步了解智能消息传递/信令框架的气息。

这无助于任何人开始一个新的领域并完全建立自己的复杂心理概念和对所有事物内部如何运作的深入理解,这显然不是任何 API 文档的野心,是吗?然而,一旦掌握了 ZeroMQ 内部架构,这将有助于任何人刷新或提醒所有可配置的细节,如源代码中详述的,在下一段中提到。

另外,对于任何确实对 或仅对 本身感兴趣的人,值得花时间和精力阅读 Pieter HINTJENS 的书“Code Connected, Volume 1”(可在pdf ) 以及他后来关于他在软件工程方面的丰富经验的任何其他书籍,因为他对现代计算的许多见解可能并且将会激发(并且很多)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2011-11-20
    • 2021-11-24
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多