Sortez-le de la boucle d'événements. Enveloppez l'appel bloquant dans asyncio.to_thread, ou utilisez run_in_executor avec un pool de threads, pour que la boucle reste libre de servir d'autres requêtes. Si le travail est limité par le CPU, envoyez-le plutôt vers un pool de processus ou un worker de fond comme Celery. Laissé en ligne, un seul appel lent fige toutes les autres requêtes de ce worker.
Pourquoi les recruteurs posent cette question
Bloquer la boucle est l'erreur asynchrone par excellence, et elle produit le pire type de panne : une latence qui a l'air correcte en test et qui s'effondre en charge. Le recruteur veut la preuve que vous comprenez l'ordonnancement coopératif, que rien ne préempte une coroutine, et que vous savez que FastAPI exécute déjà les endpoints en def simple dans un pool de threads, ce qui est souvent la réponse juste la plus simple.
Comment structurer votre réponse
- Expliquez pourquoi bloquer la boucle est fatal.
- Proposez to_thread ou un executor pour les entrées/sorties.
- Orientez le travail limité par le CPU vers des processus ou une file.
- Mentionnez l'option de l'endpoint en def simple dans FastAPI.
Exemple de réponse
Ce qui rend cela grave, c'est qu'asyncio est coopératif et monothread, donc une coroutine garde la boucle tant qu'elle n'attend pas quelque chose. Un appel de pilote bloquant posé dans un handler asynchrone gèle toutes les autres requêtes en vol sur ce worker, et sous faible trafic vous ne le remarquerez jamais. Le remède le moins cher dans FastAPI est de définir l'endpoint avec un def simple plutôt qu'un async def, et le framework l'exécute dans son pool de threads pour vous. Si j'en ai besoin dans une fonction asynchrone, asyncio.to_thread enveloppe l'appel et en attend le résultat. Là où je fais attention, c'est à la taille du pool de threads, parce que la valeur par défaut est faible et qu'une dépendance lente formera une file derrière, donc je le dimensionne selon la concurrence attendue et j'ajoute un timeout. Pour tout ce qui est lourd en CPU, les threads n'aident pas sous la build par défaut, donc cela part vers un pool de processus ou vers un worker Celery. Nous en avons attrapé un avec un vieux client SOAP qui prenait huit secondes, et la latence p99 de tout un service suivait cet unique appel.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- Comment détecteriez-vous une boucle bloquée en production ?
- Que rapporte le mode debug d'asyncio ?
- Un pilote de base de données synchrone y est-il parfois acceptable ?
Autres questions pour Développeur Python
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions