看来asyncio.Queue
只能被阅读它的同一个线程推送?例如:
import asyncio
from threading import Thread
import time
q = asyncio.Queue()
def produce():
for i in range(100):
q.put_nowait(i)
time.sleep(0.1)
async def consume():
while True:
i = await q.get()
print('consumed', i)
Thread(target=produce).start()
asyncio.get_event_loop().run_until_complete(consume())
仅打印
consumed 0
然后挂起。我错过了什么?
答案 0 :(得分:3)
你不能直接call asyncio methods from another thread。
loop.call_soon_threadsafe(q.put_nowait, i)
或asyncio.run_coroutine_threadsafe:
future = asyncio.run_coroutine_threadsafe(q.put(i), loop)
其中loop
是主线程中asyncio.get_event_loop()
返回的循环。
答案 1 :(得分:2)
您可以查看janus 该库提供了一个具有两个面的队列:一个用于异步事件循环,另一个用于经典线程代码。
我相信README很好地描述了这个库。