← retour aux snippets

asyncio.Queue: pool de workers asynchrones

Traiter des tâches en parallèle avec une file asyncio et des workers.

python asyncio #asyncio#queue#workers

objectif

Traiter des tâches en parallèle avec une file asyncio et des workers.

code minimal

import asyncio

async def worker(q: asyncio.Queue, acc: list):
    while True:
        item = await q.get()
        if item is None:
            q.task_done()
            break
        await asyncio.sleep(0.001)
        acc.append(item * 2)
        q.task_done()

async def main():
    q = asyncio.Queue()
    acc = []
    workers = [asyncio.create_task(worker(q, acc)) for _ in range(2)]
    for i in range(5):
        await q.put(i)
    for _ in workers:
        await q.put(None)
    await q.join()
    for t in workers:
        await t
    print(sum(acc) == sum(i*2 for i in range(5)))  # attendu: True

asyncio.run(main())

utilisation

import asyncio

async def main():
    q = asyncio.Queue(maxsize=10)
    await q.put(1)
    print(q.qsize() == 1)

asyncio.run(main())

variante(s) utile(s)

import asyncio
q = asyncio.Queue()
print(hasattr(q, "put_nowait"))

notes

  • Utilisez des sentinelles (None) pour arrêter proprement les workers.
  • q.join() attend que toutes les tâches aient été marquées done.