← retour aux snippets

asyncio: gather avec Semaphore et timeouts

Limiter la concurrence, gérer les délais et regrouper les résultats.

python asyncio #asyncio#gather#semaphore

objectif

Limiter la concurrence, gérer les délais et regrouper les résultats.

code minimal

import asyncio, time

async def work(i):
    await asyncio.sleep(0.01)
    return i*i

async def main():
    sem = asyncio.Semaphore(5)
    async def run(i):
        async with sem:
            return await asyncio.wait_for(work(i), timeout=0.1)
    res = await asyncio.gather(*(run(i) for i in range(5)))
    print(sum(res) == 30)  # 0^2+1^2+...+4^2 = 30
asyncio.run(main())

utilisation

import asyncio
async def f(): return 42
print(asyncio.run(f()) == 42)

variante(s) utile(s)

import asyncio
async def slow(): await asyncio.sleep(0.02); return 1
try:
    asyncio.run(asyncio.wait_for(slow(), timeout=0.001))
except asyncio.TimeoutError:
    print(True)

notes

  • wait_for encadre une coroutine avec un timeout.
  • Une Semaphore protège les ressources limitées (connexions, CPU, etc.).