1 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
一個(gè)有效的異步變體是
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())
我的結(jié)論是,當(dāng)使用 asyncio zmq 時(shí),必須通過在等待套接字的事件循環(huán)上運(yùn)行的調(diào)用來創(chuàng)建套接字。盡管原始形式?jīng)]有對(duì)事件循環(huán)做任何花哨的事情,但套接字的事件循環(huán)似乎與asyncio.run. 我不知道為什么,我沒有用 pyzmq 提出問題,因?yàn)樗麄兊奈臋n顯示了這個(gè)答案中的用法,沒有評(píng)論。
編輯回應(yīng)評(píng)論:
asyncio.run總是創(chuàng)建一個(gè)新的事件循環(huán),因此可能為傳遞到的協(xié)同例程之外實(shí)例化的套接字創(chuàng)建的循環(huán)asyncio.run(如原始問題中的 asyncio 變體)明顯不同。
添加回答
舉報(bào)