En FastAPI debes llamar a un SDK lento y bloqueante. ¿Qué opción evita bloquear el event loop?
Opciones
- Llamarlo directamente dentro de un endpoint
async def, como siempre - Usar un endpoint
defnormal, o envolverlo conasyncio.to_thread(Opción correcta) - Añadir
awaitdelante de la llamada síncrona al SDK - Aumentar el timeout del servidor para que la llamada termine
Respuesta
Declara el endpoint con def normal (corre en un threadpool) o envuelve la llamada con run_in_threadpool/asyncio.to_thread
Por qué
Los endpoints async def se ejecutan directamente en el event loop, que nunca debe bloquearse.
FastAPI ejecuta los endpoints def normales en un pool de worker threads, así que una llamada bloqueante solo bloquea ese thread.
Dentro de código async, await asyncio.to_thread(sdk.call) mueve la llamada bloqueante a un thread. No puedes hacer await de una función normal (no async).
Recuerda
Librería bloqueante → endpoint def normal o to_thread.