Ce post du créateur de Python, Guido Van Rossum, mentionne une tentative précoce de supprimer le GIL de Python:
Cela a été essayé auparavant, avec des résultats décevants, c'est pourquoi je suis réticent à y consacrer beaucoup d'efforts moi-même. En 1999, Greg Stein (avec Mark Hammond?) A produit une fourchette de Python (1.5 je crois) qui a supprimé le GIL, le remplaçant par des verrous à grain fin sur toutes les structures de données mutables. Il a également soumis des correctifs qui supprimaient la plupart des dépendances sur les structures de données globales mutables, ce que j'ai accepté. Cependant, après l'analyse comparative, il a été démontré que même sur la plate-forme avec la primitive de verrouillage la plus rapide (Windows à l'époque), elle ralentissait l'exécution à un seul thread près de deux fois, ce qui signifie que sur deux processeurs, vous pouviez obtenir un peu plus de travail fait sans le GIL que sur un seul processeur avec le GIL. Ce n'était pas suffisant et le patch de Greg a disparu dans l'oubli. (Voir le résumé de Greg sur la performance.)
Je peux difficilement contester les résultats réels, mais je me demande vraiment pourquoi cela s'est produit. Vraisemblablement, la principale raison pour laquelle la suppression du GIL de CPython est si difficile est due au système de gestion de la mémoire de comptage des références. Un programme Python typique appel Py_INCREF
et des Py_DECREF
milliers ou des millions de fois, ce qui en fait un point de contention clé si nous devions envelopper les verrous autour.
Mais, je ne comprends pas pourquoi l'ajout de primitives atomiques ralentirait un programme à thread unique . Supposons que nous venons de modifier CPython afin que la variable refcount dans chaque objet Python soit une primitive atomique. Et puis nous faisons juste un incrément atomique (instruction fetch-and-add) quand nous avons besoin d'incrémenter le compte de référence. Cela rendrait le comptage de référence Python sûr pour les threads et ne devrait pas avoir de pénalité de performances sur une application à un seul thread, car il n'y aurait pas de conflit de verrouillage.
Mais hélas, beaucoup de gens plus intelligents que moi ont essayé et échoué, alors il me manque évidemment quelque chose ici. Quel est le problème avec la façon dont je regarde ce problème?