ZMQ connect and push - как определить, не удалось ли - PullRequest
0 голосов
/ 23 октября 2018

У меня есть простая ZMQ программа, которая устанавливает сокет zmq.PUSH, connects, а затем пытается отправлять сообщения.

import zmq

zcontext = zmq.Context()
zsock = zcontext.socket(zmq.PUSH)
zsock.connect("tcp://localhost:12345")

with open(sys.argv[1]) as f:
   for line in f:
       zsock.send(line)

Это прекрасно работает, когда есть другая сторона.Но если есть проблемы со слушателем на другой стороне (например, забыл запустить слушатель, или я подключился к неправильному порту), он просто зависает после попытки отправить около 1000 сообщений (зависит от размера очереди по умолчанию).

Что правильно делать?Если есть какие-либо проблемы с другой стороной, я бы предпочел просто напечатать сообщение об ошибке и выйти изящно.

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете получить zmq.error со следующим кодом:

import zmq
import time

zcontext = zmq.Context()
zsock = zcontext.socket(zmq.PUSH)
zsock.connect("tcp://localhost:12345")

try:
    with open(sys.argv[1]) as f:
        for line in f:
            zsock.send(line, flags=NOBLOCK)
            time.sleep(.1)

except zmq.ZMQError as exc:
    print(exc)

[ ПРИМЕЧАНИЕ ]:

  • Выможно изменить метод .connect() с помощью .bind() в приведенном выше коде, а также изменить другую сторону bind на connect для контрольного примера.

  • In .bind()следует использовать метод 127.0.0.1 вместо localhost.


[ ОБНОВЛЕНИЕ ]:

  • С flags=NOBLOCK в методе .send() это повышает ZMQError, если очередь заполнена; в противном случае, это ждет, пока не освободится место.Таким образом, в этом случае будет следующее:

    zsock.send(line, flags=NOBLOCK)

...