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.