Ошибка zmq_getsockopt: zmq.error.ZMQError: Нет такого файла или каталога для ip c path - PullRequest
1 голос
/ 21 апреля 2020

Я новичок в использовании ZeroMQ, поэтому я борюсь с некоторым кодом.

Если я выполняю следующий код, ошибка не отображается:

import zmq.asyncio
ctx = zmq.asyncio.Context()
rcv_socket = ctx.socket(zmq.PULL)

rcv_socket.connect("ipc:///tmp/test")

rcv_socket.bind("ipc:///tmp/test")

Но, если я пытаюсь использовать функцию zmq_getsockopt(), она не может:

import zmq.asyncio

ctx = zmq.asyncio.Context()
rcv_socket = ctx.socket(zmq.PULL)

rcv_socket.connect("ipc:///tmp/test")

socket_path = rcv_socket.getsockopt(zmq.LAST_ENDPOINT)

rcv_socket.bind("ipc://%s" % socket_path)

Тогда я получаю:

zmq.error.ZMQError: No such file or directory for ipc path "b'ipc:///tmp/test'".

1 Ответ

0 голосов
/ 21 апреля 2020

"... новый для использования ZeroMQ, поэтому я борюсь с некоторым кодом ."

Во-первых, добро пожаловать в искусство Zen-of-Zero.


В случае, если вы никогда не работали с ZeroMQ,
здесь можно с первого взгляда посмотреть на " ZeroMQ Принципы менее чем за Пять секунд"
, прежде чем углубляться в дальнейшие детали



Скважина , вам будет намного лучше, если вы начнете с первого понимания Правил игры , чем с обучения при сбоях (да, в отличие от того, что «подражает-евангелизации-гуру» насос в толпе, что «просто кодирования» достаточно - а это не так, для ведения действительно серьезного бизнеса)

Вот почему:

Если вы прочитали опубликованный API, он все равно будет сбить вас с толку большую часть времени, если у вас нет представления о структуре системы и вы не понимаете ее внутреннее и внешнее поведение (рамка Правила игры ) работы:

Опция ZMQ_LAST_ENDPOINT должна извлекать последнюю конечную точку, привязанную для TCP и IP C транспортов. Возвращаемым значением будет строка в форме DSN ZMQ. Обратите внимание, что если хост TCP - INADDR_ANY, обозначенный *, то возвращаемый адрес будет 0.0.0.0 (для IPv4).

Это говорит о том, что точка, но не зная концепции, точка все еще скрыта от вас, чтобы увидеть ее.


Лучший следующий шаг

Если вы действительно серьезно настроены на , лучший следующий шаг после прочтения ссылки выше - прекратить кодирование и сначала уделить некоторое время чтению и пониманию сказочной книги Питера ХИНТЖЕНСА " Code Connected, Volume 1 " действительно необходимая статья для дальнейшего развития - безусловно, стоит всех ваших усилий и усилий.

Затем вы увидите почему это никогда не сработает:

import zmq.asyncio; ctx = zmq.asyncio.Context()
rcv_socket        = ctx.socket( zmq.PULL )
rcv_socket.connect( "ipc:///tmp/test" )

socket_path = rcv_socket.getsockopt( zmq.LAST_ENDPOINT )

rcv_socket.bind(    "ipc://%s" % socket_path )

, тогда как это может (но никакой обработки символа с нулевым символом в конце string здесь все еще присутствует ... что само по себе является знаком плохой практики проектирования программного обеспечения и / или самодисциплины или и того, и другого):

import zmq.asyncio; ctx = zmq.asyncio.Context()
rcv_socket        = ctx.socket( zmq.PULL )    
rcv_socket.bind(    "ipc:///tmp/test" )

socket_path = rcv_socket.getsockopt( zmq.LAST_ENDPOINT )

rcv_socket.connect( "ipc://%s" % socket_path )
...