1 回答
TA贡献1111条经验 获得超0个赞
一个有效的异步变体是
def subs(url, channel):
import asyncio
import zmq
import zmq.asyncio
ctx = zmq.asyncio.Context.instance()
async def task():
sock = ctx.socket(zmq.SUB)
sock.connect(url)
sock.setsockopt(zmq.SUBSCRIBE, channel.encode())
try:
while True:
msg = await sock.recv_multipart()
print(' | '.join(m.decode() for m in msg))
finally:
sock.setsockopt(zmq.LINGER, 0)
sock.close()
asyncio.run(task())
我的结论是,当使用 asyncio zmq 时,必须通过在等待套接字的事件循环上运行的调用来创建套接字。尽管原始形式没有对事件循环做任何花哨的事情,但套接字的事件循环似乎与asyncio.run. 我不知道为什么,我没有用 pyzmq 提出问题,因为他们的文档显示了这个答案中的用法,没有评论。
编辑回应评论:
asyncio.run总是创建一个新的事件循环,因此可能为传递到的协同例程之外实例化的套接字创建的循环asyncio.run(如原始问题中的 asyncio 变体)明显不同。
添加回答
举报