与后台线程一起使用时异步队列挂起

时间:2017-11-06 14:20:04

标签: python multithreading async-await python-multithreading python-asyncio

看来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

然后挂起。我错过了什么?

2 个答案:

答案 0 :(得分:3)

你不能直接call asyncio methods from another thread

使用loop.call_soon_threadsafe

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很好地描述了这个库。