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 變體)明顯不同。
添加回答
舉報