ZeroMQ在套接字上将ZMQError抛出绑定到ipc://协议地址python

问题描述

我正在尝试在Python中将IPC协议与ZeroMQ结合使用。

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传输将套接字绑定到本地地址时,端点应解释为标识要创建的路径名的任意字符串。

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

解决方法

URL方案为impl<T: AddAssign<i32>> Profiler<T> { pub fn increase_by_one(x: &mut T) { *x += 1; } } 。您需要添加绝对路径ipc://。所以,

/var/run/fast-service

通常,URL为publisher.bind('ipc:///var/run/fast-service') 。您需要本地主机,因此该部分为空。文件系统URL相似,ipc://<host>/<path>引用本地主机上的file:///home/foo/bar.txt