微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ZMQ客户端转换为异步后收不到消息

如何解决ZMQ客户端转换为异步后收不到消息

我有一个小客户端,我试图与我编写的回显服务器进行通信,它的代码如下:

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"5"])
    msg = await back.recv_multipart()
    print(msg)

asyncio.run(rcv())

现在服务器仍然收到[b"5",b"1",b"5"]。但是客户端挂在 msg = await back.recv_multipart()

为什么会这样?任何指针表示赞赏。

解决方法

此处提到了该问题 https://github.com/zeromq/pyzmq/issues/1296。问题是在创建附加到现有循环的全局变量后使用 asyncio.run()。将 asyncio.run(rcv()) 更改为:

loop = asyncio.get_event_loop()
loop.run_until_complete(rcv())

作品

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。