ZeroMQ 在套接字绑定到 ipc:// 协议地址(python)时抛出 ZMQError

Posted

技术标签:

【中文标题】ZeroMQ 在套接字绑定到 ipc:// 协议地址(python)时抛出 ZMQError【英文标题】:ZeroMQ threw ZMQError on socket bind to an ipc:// protocol address (python) 【发布时间】:2020-10-09 02:33:51 【问题描述】:

我正在尝试在 Python 中使用带有 ZeroMQ 的 IPC 协议。

import sys
import time

from random import randint

import zmq

def main(url=None):
    ctx = zmq.Context.instance()
    publisher = ctx.socket(zmq.PUB)
    if url:
        publisher.bind(url)
    else:
        publisher.bind('ipc://var/run/fast-service')
    # Ensure subscriber connection has time to complete
    time.sleep(1)

    # Send out all 1,000 topic messages
    for topic_nbr in range(1000):
        publisher.send_multipart([
            b"%03d" % topic_nbr,
            b"Save Roger",
        ])

if __name__ == '__main__':
    main(sys.argv[1] if len(sys.argv) > 1 else None)

它给出了以下错误:

Traceback (most recent call last):
  File "pathopub.py", line 43, in <module>
    main(sys.argv[1] if len(sys.argv) > 1 else None)
  File "pathopub.py", line 19, in main
    publisher.bind("ipc://var/run/fast-service")
  File "zmq/backend/cython/socket.pyx", line 547, in zmq.backend.cython.socket.Socket.bind
zmq.error.ZMQError: No such file or directory for ipc path "var/run/fast-service".

我不明白为什么 socket.bind() 函数会发生这种情况,因为在 documentation 中它说:

当使用zmq_bind() 和ipc 传输将套接字绑定到本地地址时,端点应被解释为标识要创建的路径名的任意字符串。

这意味着不需要提供已经创建的目录。

【问题讨论】:

【参考方案1】:

URL 方案是ipc://。你需要添加一个绝对路径/var/run/fast-service。所以,

publisher.bind('ipc:///var/run/fast-service')

更一般的 URL 是ipc://&lt;host&gt;/&lt;path&gt;。您需要本地主机,因此该部分为空。文件系统 URL 类似,file:///home/foo/bar.txt 引用本地主机上的/home/foo/bar.txt

【讨论】:

哦。我得到它。我再次运行我的代码,它给出了`zmq.error.ZMQError: Permission denied` 您可能没有那里的权限。试试ipc://tmp/fast-service 作为测试。如果你不希望它对所有人开放,你可能想把它放在一个群组可见的地方。

以上是关于ZeroMQ 在套接字绑定到 ipc:// 协议地址(python)时抛出 ZMQError的主要内容,如果未能解决你的问题,请参考以下文章

nc访问的ZeroMQ IPC Unix Domain Socket

ZeroMQ,异步阻塞套接字

Centos zeromq 消息队列 安装

ZeroMQ 反转 PUB/SUB 的问题

ZeroMQ PUB/SUB 绑定订阅者

确定REQ-REP ZeroMQ应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?