Sácala del event loop. Envuelve la llamada bloqueante en asyncio.to_thread, o usa run_in_executor con un thread pool, para que el loop quede libre para atender otras peticiones. Si el trabajo tiene carga de CPU, mándalo a un process pool o a un worker en segundo plano como Celery. Si lo dejas en línea, una sola llamada lenta atasca todas las demás peticiones de ese worker.
Por qué lo preguntan los entrevistadores
Bloquear el loop es el error asíncrono por excelencia, y produce el peor tipo de caída: una latencia que parece bien en pruebas y se desmorona bajo carga. El entrevistador quiere pruebas de que entiendes la planificación cooperativa, que nada interrumpe a una corrutina, y que sabes que FastAPI ya ejecuta los endpoints definidos con def normal en un threadpool, que muchas veces es la respuesta correcta más simple.
Cómo estructurar tu respuesta
- Explica por qué bloquear el loop es fatal.
- Ofrece to_thread o un executor para la E/S.
- Manda el trabajo con carga de CPU a procesos o a una cola.
- Menciona la opción del endpoint con def normal en FastAPI.
Ejemplo de respuesta
La razón por la que importa es que asyncio es cooperativo y de un solo hilo, así que una corrutina se queda el loop hasta que hace await de algo. Una llamada bloqueante a un driver metida en un handler asíncrono congela todas las demás peticiones en vuelo de ese worker, y con poco tráfico no te vas a enterar nunca. El arreglo más barato en FastAPI es definir el endpoint con def normal en vez de async def, y el framework lo ejecuta en su threadpool por ti. Si lo necesito dentro de una función asíncrona, asyncio.to_thread envuelve la llamada y espera el resultado. Donde tengo cuidado es en el tamaño del thread pool, porque el valor por defecto es pequeño y una dependencia lenta te va a hacer cola detrás, así que lo dimensiono según la concurrencia que espero y añado un timeout. Para cualquier cosa pesada de CPU, los hilos no ayudan con el build por defecto, así que va a un process pool o fuera, a un worker de Celery. Cazamos una de estas con un cliente SOAP antiguo que tardaba ocho segundos, y la latencia p99 de un servicio entero iba siguiendo esa única llamada.
¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.
Mira cómo funcionaPreguntas de seguimiento que puedes esperar
- ¿Cómo detectarías un loop bloqueado en producción?
- ¿Qué reporta el modo debug de asyncio?
- ¿Es aceptable alguna vez un driver de base de datos síncrono ahí?
Más preguntas para Desarrollador Python
Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.
Predecir mis preguntas