4 votes

la file d'attente asynchrone se bloque lorsqu'elle est utilisée avec un thread d'arrière-plan

Il semble que asyncio.Queue ne peut être poussé que par le même fil qui le lit ? Par exemple :

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())

n'imprime que

consumed 0

puis se bloque. Que me manque-t-il ?

4voto

Vincent Points 1135

Vous ne pouvez pas appeler des méthodes asyncio depuis un autre thread directement.

Soit utiliser loop.call_soon_threadsafe :

loop.call_soon_threadsafe(q.put_nowait, i)

Ou asyncio.run_coroutine_threadsafe :

future = asyncio.run_coroutine_threadsafe(q.put(i), loop)

donde loop est la boucle renvoyée par asyncio.get_event_loop() dans votre fil principal .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X