Dentro de un endpoint async def de FastAPI llamas a time.sleep(2) (o requests.get). ¿Qué pasa bajo carga?
Opciones
- Solo esa petición espera 2 segundos; las demás siguen ejecutándose
- El event loop queda bloqueado, así que se detienen todas las demás peticiones de ese worker (Opción correcta)
- FastAPI mueve la llamada bloqueante a un thread aparte automáticamente
- Python lanza un error porque no se permiten llamadas bloqueantes
Respuesta
Todo el event loop queda bloqueado; se detienen todas las demás peticiones de ese worker
Por qué
Un servidor async usa UN solo thread con un event loop. El loop cambia a otras peticiones cada vez que la actual está esperando en un await.
time.sleep y requests.get esperan sin await, así que el loop no puede cambiar: el thread se congela y todos los demás usuarios esperan también.
Usa versiones async (await asyncio.sleep, httpx.AsyncClient) o declara el endpoint con def normal, que FastAPI ejecuta en un thread aparte.
Recuerda
Nunca llames a código bloqueante dentro de async def.