我有一个小客户端,我试图与我编写的回显服务器进行通信,它的代码如下:
import zmq
con = zmq.Context()
back: zmq.Socket = con.socket(zmq.ROUTER)
back.setsockopt(zmq.IDENTITY, b"\x34")
back.connect("tcp://localhost:19802")
sock: zmq.Socket = con.socket(zmq.DEALER)
sock.setsockopt(zmq.IDENTITY, b"\x35")
sock.connect("tcp://localhost:19801")
sock.send_multipart([b"1", b"2", b"3", b"4", b"5"])
msg = back.recv_multipart()
print(msg)
这很好用,客户端打印 [b'broker1', b'5', b'1', b'2', b'3', b'4', b'5']
。然后我想看看我是否可以用 zmq.async
做到这一点。所以我将代码修改为以下内容:
import zmq
import zmq.asyncio
import asyncio
con = zmq.asyncio.Context()
back: zmq.asyncio.Socket = con.socket(zmq.ROUTER)
back.setsockopt(zmq.IDENTITY, b"\x34")
back.connect("tcp://localhost:19802")
sock: zmq.asyncio.Socket = con.socket(zmq.DEALER)
sock.setsockopt(zmq.IDENTITY, b"\x35")
sock.connect("tcp://localhost:19801")
async def rcv():
await sock.send_multipart([b"1", b"2", b"3", b"4", b"5"])
msg = await back.recv_multipart()
print(msg)
asyncio.run(rcv())
现在服务器仍然收到[b"5", b"1", b"2", b"3", b"4", b"5"]
。但是客户端挂在 msg = await back.recv_multipart()
。
为什么会这样?任何指针表示赞赏。
答案 0 :(得分:0)
此处提到了该问题 https://github.com/zeromq/pyzmq/issues/1296。问题是在创建附加到现有循环的全局变量后使用 asyncio.run()
。将 asyncio.run(rcv())
更改为:
loop = asyncio.get_event_loop()
loop.run_until_complete(rcv())
作品