zurück zum Artikel

Python 3.13: Endlich effizienteres Multithreading ohne Global Interpreter Lock

Rainald Menge-Sonnentag
Python

(Bild: Funtap / Shutterstock.com)

Python 3.13 bekommt ein Flag, um den Global Interpreter Lock zu deaktivieren. Er gilt als Hemmschuh für Multithreading-Anwendungen.

Nach langer Diskussion und Vorbereitung ist nun eine Änderung in die Programmiersprache Python eingeflossen, die es erlaubt, den Global Interpreter Lock (GIL) zu deaktivieren. Damit lässt sich ein Bremsklotz für Multithreading-Anwendungen entfernen.

Die Umsetzung der neuen Flags PYTHON_GIL und -X gil=0 ist via Pull Request in den Hauptzweig des CPython-Projekts [1] eingeflossen, das aktuell den Stand der Alpha 5 für Python 3.13 hat.

Python setzt auf den GIL [2], um Thread-Sicherheit zu garantieren und Race Conditions zu verhindern. Letztere treten auf, wenn mehrere parallel laufende Prozesse eines Programms auf dieselben Daten zugreifen, um sie zu verändern, womit je nach Ablauf unterschiedliche Ergebnisse auftreten können.

Der Global Interpreter Lock sorgt dafür, dass jeweils nur ein Thread aktiv läuft. Das verhindert zwar Race Conditions, bedeutet aber auch, dass Python das Potenzial von Multiprozessorsystemen beziehungsweise Mehrkernprozessoren nicht effizient nutzen kann.

Die Diskussionen über ein Ende des GIL laufen schon lange. Python 3.12 erlaubt [3] mit der Umsetzung des Python Enhancement Proposal (PEP) 684 "A Per-Interpreter GIL [4]", Sub-Interpreter zu erstellen, die unabhängige Locks haben.

Im Januar 2023 hatte Sam Gross von Metas Facebook AI Research, der unter anderem an der Entwicklung von PyTorch [5] beteiligt ist, schließlich das Python Enhancement Proposal (PEP) 703 "Making the Global Interpreter Lock Optional in CPython [6]" gestartet.

Das Python Steering Council hat im Sommer 2023 eine Umfrage durchgeführt, um herauszufinden, ob die Mehrheit des Core-Developer-Teams eine bessere Multithreading-Variante wünsche und dazu bereit sei, den Aufwand und die Probleme auf sich zu nehmen, die mit dem PEP 703 in der Übergangsphase zu erwarten sind. Das Ergebnis der Befragung zeigt [7] eine klare Zustimmung.

Nun ist ein Pull Request für das CPython-Projekt angenommen worden [8], der Flags für den Global Interpreter Lock einführt: PYTHON_GIL=0 oder -X gil=0 deaktivieren den GIL zur Laufzeit.

Die Voraussetzung dafür ist, dass Python selbst mit dem Flag Py_GIL_DISABLED erstellt wird, wie es in dem Issue "Add a mechanism to disable the GIL [9]" steht.

In Python 3.13 wird der Global Interpreter Lock noch standardmäßig aktiviert und über das Flag manuell abschaltbar sein. Ein Grund dafür ist, dass das Entwicklungsteam für den Übergang mit einigen Bugs rechnet. Sobald die Probleme behoben sind, dürfte Python standardmäßig ohne GIL laufen.

(rme [10])


URL dieses Artikels:
https://www.heise.de/-9655663

Links in diesem Artikel:
[1] https://github.com/python/cpython
[2] https://wiki.python.org/moin/GlobalInterpreterLock
[3] https://www.heise.de/news/Python-3-12-hat-Performance-klare-Syntax-und-praezisere-Fehlermeldungen-im-Fokus-9063825.html
[4] https://peps.python.org/pep-0684/
[5] https://www.heise.de/news/ML-Framework-PyTorch-2-2-Fortschritte-in-Observability-und-Effizienz-9615761.html
[6] https://peps.python.org/pep-0703/
[7] https://www.heise.de/news/Python-Plaene-fuer-effizienteres-Multithreading-ohne-Global-Interpreter-Lock-9232435.html
[8] https://github.com/python/cpython/pull/116338
[9] https://github.com/python/cpython/issues/116167
[10] mailto:rme@ix.de