265 votes

Qu'est-ce que le verrouillage de l'interpréteur global (GIL) dans CPython?

Qu'est-ce qu'un verrou d'interpréteur global et pourquoi est-ce un problème?

Beaucoup de bruit a été fait autour de la suppression du GIL de Python, et j'aimerais comprendre pourquoi c'est si important. Je n'ai jamais écrit de compilateur ni d'interpréteur moi-même, donc n'hésitez pas à fournir des détails, j'aurai probablement besoin d'eux pour comprendre.

3 votes

Regardez David Beazley vous dire tout ce que vous avez toujours voulu savoir sur le GIL.

1 votes

Voici un long article sur le GIL et le threading en Python que j'ai écrit il y a quelque temps. Il va en détail sur le sujet : jessenoller.com/2009/02/01/…

0 votes

Voici un code démontrant les effets du GIL : github.com/cankav/python_gil_demonstration

233voto

Vinay Sajip Points 41286

Le GIL de Python vise à sérialiser l'accès aux internes de l'interpréteur à partir de différents threads. Sur les systèmes multi-cœurs, cela signifie que plusieurs threads ne peuvent pas efficacement utiliser plusieurs cœurs. (Si le GIL ne conduisait pas à ce problème, la plupart des gens ne se soucieraient pas du GIL - il est soulevé comme un problème en raison de la prévalence croissante des systèmes multi-cœurs.) Si vous souhaitez en comprendre les détails, vous pouvez regarder cette vidéo ou consulter ce diaporama. Cela peut être trop d'informations, mais après tout, vous avez demandé des détails :-)

Remarquez que le GIL de Python est vraiment un problème uniquement pour CPython, l'implémentation de référence. Jython et IronPython n'ont pas de GIL. En tant que développeur Python, vous ne rencontrez généralement pas le GIL à moins que vous n'écriviez une extension C. Les auteurs d'extensions C doivent libérer le GIL lorsque leurs extensions effectuent des entrées/sorties bloquantes, afin que les autres threads du processus Python aient la possibilité de s'exécuter.

52 votes

Bonne réponse - cela signifie essentiellement que les threads en Python ne sont bons que pour les I/O bloquantes ; votre application n'utilisera jamais plus d'un cœur de processeur CPU

10 votes

"En tant que développeur Python, vous ne rencontrez généralement pas le GIL à moins que vous n'écriviez une extension C" - Vous pourriez ne pas savoir que la cause de votre code multithread fonctionnant à pas de tortue est le GIL, mais vous en ressentirez certainement les effets. Il me surprend toujours que pour tirer parti d'un serveur 32 cœurs avec Python, je doive avoir 32 processus avec tous les frais associés.

6 votes

@PaulBetts: ce n'est pas vrai. Il est probable que le code critique en termes de performances utilise déjà des extensions C qui peuvent et libèrent le GIL, par exemple les modules regex, lxml, numpy. Cython permet de libérer le GIL dans un code personnalisé, par exemple b2a_bin(data)

63voto

Jon Skeet Points 692016

Supposons que vous avez plusieurs threads qui ne se touchent pas vraiment. Ceux-ci devraient s'exécuter de manière aussi indépendante que possible. Si vous avez un "verrou global" que vous devez acquérir pour (disons) appeler une fonction, cela peut devenir un goulot d'étranglement. Vous pourriez finir par ne pas bénéficier beaucoup de l'utilisation de plusieurs threads en premier lieu.

Pour utiliser une analogie du monde réel : imaginez 100 développeurs travaillant dans une entreprise avec seulement une seule tasse à café. La plupart des développeurs passeraient leur temps à attendre du café au lieu de coder.

Rien de tout cela n'est spécifique à Python - je ne connais pas les détails pour lesquels Python avait besoin d'un GIL en premier lieu. Cependant, j'espère que cela vous a donné une meilleure idée du concept général.

0 votes

Sauf attendre que la tasse à café semble être un processus assez lié à l'E/S, car ils peuvent certainement faire d'autres choses en attendant la tasse. Le GIL a très peu d'effet sur les fils lourds en E/S qui passent la plupieur de leur temps à attendre de toute façon.

0 votes

16voto

fulmicoton Points 5389

Chaque fois que deux threads ont accès à la même variable, vous avez un problème. En C++ par exemple, la façon d'éviter le problème est de définir un verrou mutex pour empêcher deux threads de, disons, entrer dans le setter d'un objet en même temps.

Le multithreading est possible en python, mais deux threads ne peuvent pas être exécutés en même temps avec une granularité plus fine qu'une instruction python. Le thread en cours d'exécution obtient un verrou global appelé GIL.

Cela signifie que si vous commencez à écrire du code multithreadé pour profiter de votre processeur multicœur, votre performance ne s'améliorera pas. La solution habituelle consiste à passer au multiprocessus.

Il est possible de libérer le GIL si vous vous trouvez à l'intérieur d'une méthode que vous avez écrite en C par exemple.

L'utilisation d'un GIL n'est pas inhérente à Python mais à certains de ses interprètes, y compris le plus courant CPython. (#édité, voir commentaire)

Le problème du GIL est toujours d'actualité dans Python 3000.

0 votes

Stackless a toujours un GIL. Stackless n'améliore pas le threading (comme le module) - il offre une méthode de programmation différente (coroutines) qui tentent de contourner le problème, mais nécessitent des fonctions non bloquantes.

0 votes

Que pensez-vous du nouveau GIL en 3.2 ?

0 votes

Juste pour ajouter que vous n'avez pas besoin de mutex / sémaphores si un seul thread mettra à jour la mémoire. @new123456 cela réduit la contention et planifie mieux les threads sans nuire aux performances monofilaire (ce qui est impressionnant en soi) mais c'est toujours un verrou global.

7voto

hughdbrown Points 15770

Regardez David Beazley vous dire tout ce que vous avez toujours voulu savoir sur le GIL.

3voto

jnoller Points 707

Voici un article assez long parlant du GIL et du threading en Python que j'ai écrit il y a quelque temps. Il va dans pas mal de détails à ce sujet :

http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X