У меня есть программа, использующая сокет 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 возвращает ...