objectif
Exécuter une fonction bloquante sans bloquer l’event loop.
code minimal
import asyncio, time
def slow_add(x, y):
time.sleep(0.005)
return x + y
async def main():
loop = asyncio.get_running_loop()
res = await loop.run_in_executor(None, slow_add, 1, 2)
print(res == 3) # attendu: True
asyncio.run(main())
utilisation
import asyncio, time
def compute(n=10000):
time.sleep(0.001)
return sum(range(n))
async def main():
loop = asyncio.get_running_loop()
s = await loop.run_in_executor(None, compute, 1000)
print(isinstance(s, int))
asyncio.run(main())
variante(s) utile(s)
import asyncio
print(callable(asyncio.get_running_loop))
notes
- None choisit le ThreadPoolExecutor global par défaut.
- Préférez asyncio.to_thread en 3.9+ quand c’est suffisant.