Python risque de perdre son Global Interpreter Lock, un composant clé de CPython,
pour gagner beaucoup plus en rapidité
Un nouveau projet visant à modifier le runtime CPython afin d'améliorer les performances multithread a attiré l'attention de l'équipe principale de développement de Python. Le développeur python Sam Gross a proposé une modification majeure du Global Interpreter Lock (GIL), l'implémentation de référence de Python. « J'ai travaillé sur des modifications de CPython pour lui permettre de s'exécuter sans le verrouillage global de l'interpréteur. J'aimerais partager une preuve du concept de fonctionnement sans le GIL. Cette preuve de concept implique des changements substantiels internes à CPython, mais relativement peu de changements à l'interface C-API. Elle est compatible avec de nombreuses extensions C », a déclaré Sam Gross.
Rappelons que le Python Global Interpreter Lock, en termes simples, est un verrou qui permet à un seul thread de détenir le contrôle de l'interpréteur Python. Cela signifie qu'un seul thread peut être en état d'exécution à un moment donné. L'impact de le GIL n'est pas visible pour les développeurs qui exécutent des programmes monofilaires, mais elle peut constituer un goulot d'étranglement en termes de performances pour les codes multithread et liés au processeur.
Étant donné que le GIL ne permet l'exécution que d'un seul thread à la fois, même dans une architecture multithread avec plus d'un cœur de CPU, il a acquis la réputation d'être une fonctionnalité « déshonorante » de Python. Elle a longtemps été considérée comme un obstacle à l'amélioration des performances multithread de CPython (et donc de Python en général). De nombreux efforts ont été déployés pour la supprimer au fil des ans, mais au prix d'une dégradation des performances monothread (en d'autres termes, en rendant la grande majorité des applications Python existantes plus lentes).
Les métaphores actuelles de Python pour traiter le threading et le multiprocessing ne rendent pas impossible la réalisation d'un parallélisme élevé. Mais elles rendent la tâche suffisamment difficile pour que les développeurs se tournent souvent vers des modules tiers comme Dask pour y parvenir. L'objectif de l'élimination de le GIL serait d'améliorer les performances des programmes multithreads. Toute proposition doit donc montrer qu'elle y parvient en pratique.
L’équipe de développement de Python a déclaré qu'elle rejetterait toute proposition dans ce sens qui ralentirait les programmes monothread. La nouvelle proposition modifie la façon dont le comptage des références fonctionne pour les objets Python, de sorte que les références provenant du thread qui possède un objet sont traitées différemment de celles provenant d'autres threads. En début de ce mois, Python a été annoncé comme langage de programmation le plus populaire sur TIOBE dans l'édition d'octobre détrônant ainsi le C, une première en plus de 20 ans.
Python est un langage de programmation interprété, multi-paradigme et multi-plateformes. Il favorise la programmation impérative structurée, fonctionnelle et orientée objet. Il est doté d'un typage dynamique fort, d'une gestion automatique de la mémoire par récupérateur de mémoire et d'un système de gestion d'exceptions ; il ressemble ainsi à Perl, Ruby, Scheme, Smalltalk et Tcl. L'équipe de développement a annoncé le 4 octobre les améliorations et les nouvelles fonctionnalités de la version 3.11 de Python. Cette version améliore la localisation des erreurs dans les logs et optimise le formatage de style C avec un format littéral ne contenant que les codes de format %s, %r et %. Les compréhensions asynchrones sont maintenant autorisées à l'intérieur des compréhensions dans les fonctions asynchrones. Les compréhensions externes deviennent implicitement asynchrones.
Python gagne en popularité ces temps-ci, en partie à cause de l'essor de la science des données et de son écosystème de bibliothèques logicielles d'apprentissage automatique comme NumPy, Pandas, TensorFlow de Google et PyTorch de Facebook. En effet, Python continuerait d'être la norme et la compétence la plus recherchée dans le domaine de la science des données, dépassant de loin les autres technologies et outils, comme R, SAS, Hadoop et Java. C'est ce que suggère une analyse réalisée par Terence Shin, un spécialiste des données, qui a indiqué que l'adoption de Python pour la science des données continue de croître alors même que le langage R, plus spécialisé, est en déclin.
Python est également un langage facile à apprendre qui a trouvé une niche dans le matériel haut de gamme, mais moins dans les appareils mobiles et le Web un problème que le créateur de Python, Guido van Rossum, espère résoudre grâce à des améliorations de performances sur lesquelles il travaille chez Microsoft. L'effet global l’apport de Sam Gross, et d'un certain nombre d'autres modifications, augmente en fait légèrement les performances monothread d'environ 10 %, selon certains benchmarks réalisés sur une version fork de l'interpréteur par rapport à la version 3.9 de l'interpréteur CPython.
Quel problème le GIL a-t-il résolu pour Python ?
Python utilise le comptage de références pour la gestion de la mémoire. Cela signifie que les objets créés en Python ont une variable de comptage de références qui garde la trace du nombre de références qui pointent vers l'objet. Lorsque ce compte atteint zéro, la mémoire occupée par l'objet est libérée. Voici, ci-dessous, un bref exemple de code qui montre comment fonctionne le comptage de références :
Dans l'exemple ci-dessus, le nombre de références pour l'objet liste vide [] était de 3. L'objet liste était référencé par a, b et l'argument passé à sys.getrefcount().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 import sys >>> a = [] >>> b = a >>> sys.getrefcount(a) 3
Le problème est que cette variable de comptage de références devait être protégée contre les conditions de course où deux threads augmentent ou diminuent sa valeur simultanément. Si cela se produit, cela peut provoquer une fuite de mémoire qui n'est jamais libérée ou, pire encore, une libération incorrecte de la mémoire alors qu'une référence à cet objet existe toujours. Cela peut provoquer des plantages ou d'autres bogues dans un programme Python.
Cette variable de comptage des références peut être maintenue en sécurité en ajoutant des verrous à toutes les structures de données qui sont partagées entre plusieurs threads afin qu'elles ne soient pas modifiées de manière incohérente. Mais l'ajout d'un verrou à chaque objet ou groupe d'objets signifie que plusieurs verrous existeront, ce qui peut causer un autre problème : les blocages (les blocages ne peuvent se produire que s'il y a plus d'un verrou). Un autre effet secondaire serait une diminution des performances causée par l'acquisition et la libération répétées des verrous.
Le GIL est un verrou unique sur l'interpréteur lui-même qui ajoute une règle selon laquelle l'exécution de tout bytecode Python nécessite l'acquisition du verrou de l'interpréteur. Cela empêche les blocages (puisqu'il n'y a qu'un seul verrou) et n'introduit pas beaucoup de surcharge de performance. Mais cela rend effectivement tout programme Python lié au CPU monothread.
Le GIL, bien qu'utilisée par les interprètes d'autres langages comme Ruby, n'est pas la seule solution à ce problème. Certains langages évitent l'utilisation d'un GIL pour une gestion sécurisée de la mémoire en utilisant des approches autres que le comptage de références, comme le garbage collection. Si la proposition de Sam Gross est acceptée, son code réécrira la manière dont Python sérialise l'accès aux objets dans son runtime à partir de plusieurs threads, et améliorera considérablement les performances multithread.
Source : Python.org
Et vous ?
Quel est votre avis sur le sujet ?
Que pensez-vous de Python en général et de GIL en particulier ?
Voir aussi :
Python devient le langage de programmation le plus populaire sur TIOBE dans l'édition d'octobre et détrône C, une première en plus de 20 ans
Python 3.11 améliore l'emplacement des erreurs dans les tracebacks, et apporte de nouvelles fonctionnalités
Une poignée de paquets contenant du code malveillant a été téléchargée 30 000 fois sur PyPI et près de la moitié des paquets sur PyPI ont au moins un problème de sécurité, annoncent des chercheurs
La première version EAP de PyCharm 2021.3 est disponible, avec une toute nouvelle expérience Jupyter Notebook, le support de FastAPI et un meilleur support de Python 3.10
Partager