Le Global Interpreter Lock est un mutex de CPython qui n'autorise qu'un seul thread à exécuter du bytecode Python à la fois, ce qui protège l'état de l'interpréteur comme les compteurs de références et les structures internes des objets. Autrement dit, les threads ne vous donnent aucun gain de parallélisme sur du code Python limité par le CPU, mais ils restent utiles pour les entrées/sorties, parce que le verrou est relâché pendant les appels bloquants et le travail des extensions C.
Pourquoi les recruteurs posent cette question
C'est la question filtre classique sur la profondeur en Python. Le recruteur veut vous entendre expliquer pourquoi les threads aident sur le travail limité par les entrées/sorties et pas sur celui limité par le CPU, et qu'il vous reste le multiprocessing ou les extensions natives quand vous avez besoin de vrai parallélisme. Les réponses vagues du type Python ne sait pas faire de threads trahissent quelqu'un qui a mémorisé un slogan plutôt que raisonné sur le runtime.
Comment structurer votre réponse
- Définissez le GIL en une phrase.
- Dites ce qu'il protège et pourquoi CPython l'a.
- Opposez le travail limité par les entrées/sorties et celui limité par le CPU.
- Nommez les portes de sortie que vous utilisez vraiment.
Exemple de réponse
Le GIL est un verrou unique dans CPython qui garantit qu'un seul thread exécute du bytecode Python à un instant donné. Il existe parce que le comptage de références n'est pas sûr en environnement multithread, et parce qu'un verrou par objet serait plus lent dans le cas monothread où vit la majorité du code. Concrètement, les threads sont excellents pour attendre et inutiles pour calculer. Sur un pipeline de données sur lequel j'ai travaillé, une étape allait chercher environ huit cents URL, et passer d'une boucle séquentielle à un pool de threads l'a fait tomber d'environ neuf minutes à moins d'une, parce que chaque worker passe sa vie bloqué sur un socket et relâche le verrou pendant qu'il attend. L'étape de parsing juste à côté n'y a rien gagné du tout, donc nous l'avons poussée dans un pool de processus. Numpy et d'autres extensions C relâchent aussi le verrou pendant leurs appels natifs longs, ce qui explique pourquoi les gros calculs matriciels peuvent sembler parallèles même dans des threads. Quand on me dit que Python ne sait pas faire de concurrence, je demande en général de quel type on parle.
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
- Alors comment le multiprocessing le contourne-t-il ?
- Qu'arrive-t-il au GIL quand une extension C s'exécute ?
- Avez-vous regardé la build free-threaded ?
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