3

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

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()によって返されたループです。

+0

あなたの提案にうまくいくことはありません(以前と同じ方法でハングアップしています)。 –

+2

ああ。メインスレッドと同じループを使用する必要があり、 'get_event_loop'はそのためではありません。 –

+0

@JonasByströmまさに、編集のおかげで! – Vincent

2

janus ライブラリには、非同期イベントループ用と古典的なスレッドコード用の2つのフェイスが含まれています。

私はREADMEがライブラリをかなりよく説明していると信じています。

+0

'asyncio'の使い方を理解したので、これはほんの1行であり、ソース全体でいくつかの文字が標準ライブラリに準拠しています。 (難しかったのは「それを手に入れた」ということだ。 –

関連する問題