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