【问题标题】:ZMQ client does not recieve messages after converting to asyncZMQ客户端转async后收不到消息
【发布时间】:2021-06-26 00:26:15
【问题描述】:

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

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()

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

【问题讨论】:

    标签: python zeromq pyzmq


    【解决方案1】:

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

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

    作品

    【讨论】:

      猜你喜欢
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      相关资源
      最近更新 更多