【发布时间】:2019-09-09 03:51:17
【问题描述】:
我正在尝试通过在后台线程上接收消息同时使用控制台输入发送消息来设置两个对等方之间使用 zmq.PAIR 的异步通信的 hello world 样式示例:
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 机器上完全可以正常工作,但在从 Windows 10 命令提示符运行时,socket.send_string 会阻止任一进程。造成这种差异的原因是什么?
套接字设置正确,刷新所有输出没有区别。读取本身也可以按预期工作,可以通过在浏览器中导航到 127.0.0.1:5556 来验证。查看 Wireshark 中的环回接口也可以发现连接设置正确,但没有发送任何消息。
但是,如果我在客户端注释掉 recv_thread.start(),消息将通过 Wireshark 进行验证,这表明 socket.recv_string 以某种方式阻止了套接字发送,即使它在 Linux 上没有这样做.
我还可以通过使用两组 PUSH/PULL(参见this answer)来实现所需的行为,但这并不能完全帮助解释手头示例中发生的情况。
这适用于两个系统上的 Python 3.7.1、pyzmq 18.0.0 和 libzmq 4.3.1。
【问题讨论】:
标签: python multithreading sockets zeromq pyzmq