PYZMQ не возвращается - PullRequest
       13

PYZMQ не возвращается

1 голос
/ 08 апреля 2019

У меня есть программа, использующая сокет ZMQ REQ / REP, чтобы проверить, работает ли определенный модуль на хосте.

Требуемое поведение состоит в том, что если я получаю ответ от модуля, я делаю что-то, а если нет (то есть, если на указанном порту нет сокета ZMQ REQ, то я хочу, чтобы программа возвратила.

В случае ошибки я ожидаю получить исключение zmq.error.Again, на которое я могу реагировать.

Мой упрощенный подход выглядит следующим образом:

import zmq

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.setsockopt(zmq.RCVTIMEO, 1000)
socket.setsockopt(zmq.SNDTIMEO, 1000)

try:
    socket.connect ("tcp://localhost:5104")
    socket.send_string("hello")
    message = socket.recv(zmq.NOBLOCK) 

except Exception as e:
    print('Exception occured: ',e)

socket.close()

В IPython код работает какожидается, что если нет ответа, он генерирует исключение и возвращает.Если я вызываю этот код из командной строки, он выдает исключение, делает печать, но потом не возвращает - окно cmd будет зависать после печати с мигающим курсором.Если я закомментирую socket.send_string и socket.recv, он также будет обычно возвращаться при использовании командной строки.

Любые идеи, почему IPython и вызовы из командной строки дают разные поведения?

Моя системаподробнее:

Windows 7

Anaconda 3

python 3.6.7

zeromq 4.2.5

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

Я нашел ответ, почему он не возвращает здесь .В основном ZMQ пытается закрыть сокет, который никогда не был открыт.Это поведение можно изменить, установив для параметра LINGER значение True:

socket.setsockopt(zmq.LINGER, True)

Но я до сих пор не понимаю, почему IPython возвращает ...

...