【问题标题】:How do I set INVERT_MATCHING on a ZeroMQ PUB socket with PyZMQ?如何使用 PyZMQ 在 ZeroMQ PUB 套接字上设置 INVERT_MATCHING?
【发布时间】:2018-03-13 23:20:33
【问题描述】:

我正在使用由 ZeroMQ 4.1.6 支持的 PyZMQ 16.0.4,并试图更好地了解套接字选项 INVERT_MATCHING

我在 repl 中尝试了以下内容:

>>> import zmq
>>> context = zmq.Context.instance()
>>> pubsock = context.socket(zmq.PUB)
>>> pubsock.INVERT_MATCHING = 1

最后一行给我一个错误

AttributeError: Socket has no such option: INVERT_MATCHING.

我只是在 PyZMQ 中看到了一个错误吗?

或者我需要做一些不同的事情来设置这个选项吗?

【问题讨论】:

    标签: zeromq distributed-system pyzmq


    【解决方案1】:

    我们走吧:使用.setsockopt()

    print( "ZeroMQ version ought be 4.2+ ... Hope it is... " )
    print( zmq.version() )
    print( pubsock.setsockopt.__doc__ )
    pass;  pubsock.setsockopt( zmq.INVERT_MATCHING, 1 )
    

    另外最好重新阅读文档:

    当设置为 1 时,反转 PUB-SUB 套接字的过滤行为。

    PUBXPUB 套接字上,这会导致消息发送到所有连接的套接字,但订阅了与消息匹配的前缀的套接字除外。在 SUB 套接字上,这会导致用户只接收与任何套接字订阅不匹配的传入消息。

    每当 PUB 套接字上的 ZMQ_INVERT_MATCHING 设置为 1 时,连接到它的所有 SUB 套接字也必须将选项设置为 1。否则,@987654330 @ 套接字拒绝 PUB 套接字发送给它们的所有内容

    XSUB 套接字不需要这样做,因为它们不过滤传入的消息。

    【讨论】:

    • !!!我用自制软件安装了 ZMQ 4.2.3,但 zmq.version() 返回 40106 (4.1.6)。谢谢指点!
    • 哦,是的,我只是在检查以确保它确实首先解决了我的问题。我还没有弄清楚为什么/如何解决错误的 ZeroMQ 版本
    • 恕我直言,这是另一个主题/活动,与根本原因分析+自我诊断步骤+API文档提醒无关,是吗?
    • 在我确认它解决了问题之前,我无法接受答案。如果您说“尝试移动您的笔记本电脑”,我会以同样的方式对待它......我会尝试一下,看看是否可以解决问题,如果可以,请接受。要有耐心。
    • 试着移动你的笔记本电脑” - 严重吗?谁说的?随心所欲。 但即使您从未设法安装 4.2 API / DLL,答案也是正确且完整的,因此添加越来越多的 if-s 和 when-s 是可能的,但 不相关原来的问题,是吗?
    【解决方案2】:

    ZeroMQ PUB-从version 4.2 开始,sockets 只支持反转匹配。您需要更新您的 ZeroMQ。

    请注意,PyZMQ 捆绑了预编译的 ZeroMQ 4.1.6。因此,根据您安装 PyZMQ 的方式,您可能实际上并未使用系统的 ZeroMQ。

    尝试以下方法重新安装 PyZMQ 并强制重新编译 ZeroMQ 后端。

    $ pip install pyzmq --ignore-installed --no-use-wheel
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多