← retour aux snippets

asyncio.run_in_executor: déplacer du bloquant dans un pool

Exécuter une fonction bloquante sans bloquer l'event loop.

python asyncio #asyncio#threadpool

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.