Я пытаюсь настроить пример приветственного мирового стиля асинхронной связи между двумя одноранговыми узлами с помощью zmq.PAIR
, получая сообщения в фоновом потоке, используя консольный ввод для отправки сообщений:
server.py
import zmq
import threading
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind('tcp://*:5556')
def print_incoming_messages():
while True:
msg = socket.recv_string()
print(f'Message from client: {msg}')
recv_thread = threading.Thread(target=print_incoming_messages)
recv_thread.start()
while True:
msg = input('Message to send: ')
socket.send_string(msg)
client.py
:
import zmq
import threading
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.connect('tcp://127.0.0.1:5556')
def print_incoming_messages():
while True:
msg = socket.recv_string()
print(f'Message from server: {msg}')
recv_thread = threading.Thread(target=print_incoming_messages)
recv_thread.start()
while True:
msg = input('Message to send: ')
socket.send_string(msg)
Это прекрасно работает на компьютере с Linux, но socket.send_string
блокируется в любом процессе при запуске из командной строки Windows 10. В чем причина этого несоответствия?
Разъем настроен правильно, промывка всех выходов не имеет значения. Само чтение также работает, как и ожидалось, что можно проверить, перейдя к 127.0.0.1:5556 в браузере. Просмотр интерфейса обратной связи в Wireshark также показывает, что соединение установлено правильно, но сообщения не отправляются.
Если я закомментирую recv_thread.start()
в клиенте, однако, сообщения отправляются через, что может быть проверено в Wireshark, что предполагает, что каким-то образом socket.recv_string
блокирует отправку сокета, даже если это не происходит в Linux .
Я также могу достичь желаемого поведения, используя два набора PUSH / PULL (ср. этот ответ ), но это не совсем помогает объяснить, что происходит в данном примере.
Это на Python 3.7.1, pyzmq 18.0.0 и libzmq 4.3.1 в обеих системах.