Looking for python Keywords? Try Ask4Keywords

Python LanguageTravailler autour du verrou d'interprète global (GIL)


Remarques

Pourquoi y a-t-il un GIL?

Le GIL existe dans CPython depuis la création des threads Python, en 1992. Il est conçu pour garantir la sécurité des threads lors de l’exécution du code python. Les interpréteurs Python écrits avec un GIL empêchent plusieurs threads natifs d'exécuter les bytecodes Python à la fois. Cela permet aux plug-ins de s'assurer que leur code est thread-safe: verrouillez simplement le GIL et seul votre thread actif peut s'exécuter, votre code est donc automatiquement compatible avec les threads.

Version courte: le GIL garantit que peu importe le nombre de processeurs et de threads que vous avez, un seul thread d'un interpréteur Python s'exécutera en même temps.

Cela présente de nombreux avantages en termes de facilité d'utilisation, mais présente également de nombreux avantages négatifs.

Notez qu'un GIL n'est pas une exigence du langage Python. Par conséquent, vous ne pouvez pas accéder au GIL directement à partir du code python standard. Toutes les implémentations de Python n'utilisent pas de GIL.

Interprètes ayant un GIL: CPython, PyPy, Cython (mais vous pouvez désactiver le GIL avec nogil )

Interprètes sans GIL: Jython, IronPython

Détails sur le fonctionnement du GIL:

Lorsqu'un thread est en cours d'exécution, il verrouille le GIL. Lorsqu'un thread veut s'exécuter, il demande le GIL et attend qu'il soit disponible. Dans CPython, avant la version 3.2, le thread en cours d'exécution vérifiait après un certain nombre d'instructions python pour voir si un autre code voulait le verrou (c'est-à-dire qu'il libérait le verrou et le demandait à nouveau). Cette méthode avait tendance à provoquer la famine des threads, en grande partie parce que le thread qui libérait le verrou l'acquitterait à nouveau avant que les threads en attente aient une chance de se réveiller. Depuis 3.2, les threads qui veulent le GIL attendent le verrouillage pendant un certain temps et, après ce temps, ils définissent une variable partagée qui force le thread en cours d'exécution à céder. Cela peut néanmoins entraîner des délais d'exécution considérablement plus longs. Voir les liens ci-dessous à partir de dabeaz.com (dans la section des références) pour plus de détails.

CPython libère automatiquement le GIL lorsqu'un thread effectue une opération d'E / S. Les bibliothèques de traitement d'images et les opérations de calcul numérique numérotées libèrent le GIL avant d'effectuer leur traitement.

Avantages du GIL

Pour les interprètes qui utilisent le GIL, le GIL est systémique. Il est utilisé pour préserver l'état de l'application. Les avantages comprennent:
  • Collecte des ordures - Le nombre de références thread-safe doit être modifié lorsque le GIL est verrouillé. Dans CPython, toute la collection Garbarge est liée au GIL. C'est un gros voir l'article wiki python.org sur le GIL (listé dans Références ci-dessous) pour plus de détails sur ce qui doit encore être fonctionnel si l'on voulait supprimer le GIL.
  • Facilité pour les programmeurs traitant du GIL - le verrouillage de tout est simpliste, mais facile à coder
  • Facilite l'importation de modules d'autres langages

Conséquences du GIL

Le GIL n'autorise qu'un seul thread à exécuter du code python à la fois dans l'interpréteur python. Cela signifie que le multithreading de processus exécutant un code Python strict ne fonctionne tout simplement pas. Lorsque vous utilisez des threads sur le GIL, vous aurez probablement de moins bonnes performances avec les threads que si vous les exécutiez dans un seul thread.

Les références:

https://wiki.python.org/moin/GlobalInterpreterLock - résumé rapide de ce qu'il fait, des détails précis sur tous les avantages

http://programmers.stackexchange.com/questions/186889/why-was-python-written-with-the-gil - résumé clairement écrit

http://www.dabeaz.com/python/UnderstandingGIL.pdf - comment fonctionne le GIL et pourquoi il ralentit sur plusieurs cœurs

http://www.dabeaz.com/GIL/gilvis/index.html - visualisation des données montrant comment le GIL verrouille les threads

http://jeffknupp.com/blog/2012/03/31/pythons-hardest-problem/ - simple à comprendre l'histoire du problème GIL

https://jeffknupp.com/blog/2013/06/30/pythons-hardest-problem-revisited/ - des détails sur la manière de contourner les limitations du GIL

Travailler autour du verrou d'interprète global (GIL) Exemples Liés