Weiter zum Inhalt

Python Global Interpreter Lock Tutorial

Erfahre, was der Global Interpreter Lock ist, wie er funktioniert und warum er eingesetzt wird.
Aktualisiert 18. Sept. 2026  · 8 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Wenn du gerade erst mit Python startest und mehr lernen möchtest, schau dir den DataCamp-Kurs Introduction to Data Science in Python an.

Ein Global Interpreter Lock (GIL) ist ein Mechanismus, der einen globalen Lock auf einen Interpreter legt. Er wird in Interpretersprachen eingesetzt, um die Ausführung von Threads zu synchronisieren und zu steuern, sodass jeweils nur ein nativer Thread (vom Betriebssystem geplant) gleichzeitig ausgeführt werden kann.

In Szenarien mit mehreren Threads kann es passieren, dass zwei Threads gleichzeitig auf denselben Speicher zugreifen wollen und sich dadurch gegenseitig Daten überschreiben. Deshalb braucht es einen Mechanismus, der genau dieses Verhalten verhindert.

Zu den bekannten Interpretern mit GIL zählen CPython und Ruby MRI. Wie du weißt, ist Python eine interpretierte Sprache und hat verschiedene Distributionen wie CPython, Jython, IronPython. Von diesen unterstützt nur CPython den GIL, und es ist zugleich die am weitesten verbreitete Python-Implementierung. CPython wurde in C und Python entwickelt, vor allem um Anwendungen zu unterstützen, die stark auf C aufbauen.

Selbst wenn dein Prozessor mehrere Kerne hat, erlaubt ein Global Interpreter Lock immer nur die Ausführung eines Threads zur selben Zeit. Der Grund: Sobald ein Thread läuft, erwirbt er den GIL. Wartet er anschließend auf eine I/O-Operation (Lesen/Schreiben auf die Festplatte) oder führt eine CPU-lastige Operation aus (z. B. Vektor-/Matrixmultiplikation), gibt er den Lock frei, damit andere Threads desselben Prozesses laufen können. Das verhindert, dass mehrere Threads gleichzeitig ausgeführt werden.

thread

Schauen wir uns das Diagramm kurz an. Es gibt eine Funktion factorial und zwei Threads, 1 und 2. Thread 1 hält den Lock, während Thread 2 wartet. Das heißt: Nur einer der Threads kann die Funktion nutzen. Nehmen wir an, die Funktion factorial benötigt 2 Sekunden. Idealerweise sollten beide Threads in 2 Sekunden fertig sein. In Python ist das anders: Beide Threads laufen nacheinander, nicht parallel.

Wenn die Threads 1 und 2 die Funktion factorial aufrufen, kann das doppelt so lange dauern, wie wenn ein einzelner Thread die Funktion zweimal aufruft. Das zeigt auch, dass der vom Interpreter gesteuerte Speichermanager nicht thread-safe ist, also dass mehrere Threads nicht gleichzeitig auf dieselben geteilten Daten zugreifen können.

Folglich bewirkt der GIL (Quelle: Understanding the Python GIL):

  • Er begrenzt Threading-Operationen.

  • Parallele Ausführung wird eingeschränkt.

  • Er stellt sicher, dass immer nur ein Thread gleichzeitig im Interpreter läuft.

  • Er vereinfacht diverse Low-Level-Details wie Speicherverwaltung.

Mit GIL wird kooperatives Rechnen bzw. koordiniertes Multitasking statt echter Parallelität erreicht.

gil
Source</a

Wie im Diagramm zu sehen, gibt es drei Threads. Zunächst läuft Thread 1 und hat den GIL. Sobald eine I/O-Operation wie Lesen oder Schreiben ansteht, gibt Thread 1 den GIL frei, und Thread 2 übernimmt. Dieser Zyklus wiederholt sich, der GIL wechselt ab, bis alle Threads ihr Programm beendet haben. Wichtig: Threads ohne Lock, die noch nicht fertig sind, bleiben in der Warteposition.

GIL in Python2 vs. Python3
gil

Der Global Interpreter Lock in Python 2.7 verhält sich anders als in Python 3. Bei rein CPU-lastigen Aufgaben läuft ein Thread einfach weiter, da keine I/O-Operationen anstehen – die anderen Threads warten untätig, was ungewünscht ist. Um das zu entschärfen, führte Python 2 das Konzept der ticks ein. Der GIL prüft periodisch den Zustand der Threads – warten sie, führen sie I/O aus oder laufen sie? Diese Prüfung findet nicht kontinuierlich statt, sondern in Abständen von jeweils 100 ticks.

Ein Tick ist eine Bytecode-Instruktion. Nach 100 Bytecode-Instruktionen prüft der GIL, ob Threads laufen oder warten. Wichtig: Ein Tick ist nicht zeitbasiert, sondern an Bytecode gekoppelt – daher können Ticks unterschiedlich lange dauern.

gil
Source</a

Diese periodische Prüfung alle 100 Ticks ist vor allem bei CPU-lastigen Aufgaben wichtig, da dort keine I/O-Ereignisse auftreten. Hinweis: Du kannst den Tick-Zähler über das eingebaute Python-Modul sys anpassen.

gil
Source</a

Schauen wir uns einige Nachteile dieses Ansatzes an:

In diesem Diagramm siehst du, dass Threads nicht parallel, sondern seriell laufen – kooperatives Rechnen, gesteuert durch den GIL. Zudem müssen Threads teils lange warten. Beispiel: Thread T3 musste warten, bis T1 und T2 den GIL freigegeben hatten. Threads hungern also nach Lock und Rechenzeit.

Ein weiterer Nachteil: Es entsteht ein Wettlauf darum, welcher Thread den GIL bekommt. Anfangs mag T1 aufgrund höherer Priorität den GIL erhalten, dann T2 usw. Gibt T3 den GIL frei, benachrichtigt er alle anderen Threads, die dann um den GIL konkurrieren. Dem kannst du entgegenwirken, indem du Thread-Prioritäten setzt.

In Python 3 ist jedem Thread eine feste Zeitscheibe zugewiesen, z. B. 5 ms Ausführungszeit. Dadurch hungern Threads nicht nach Ressourcen, weil alle gleich lange warten. Threads prüfen, ob Thread 1 den GIL freiwillig freigibt (etwa durch I/O oder sleep). Falls nicht, wird er nach 5 ms erzwungen freigegeben. So gibt es keine Verknappung von CPU-Zeit, alle Threads erhalten gleich viel Zeit, und das Problem, den GIL zu ergattern, wird entschärft.

gil

Wichtig ist allerdings: Die neue GIL-Implementierung priorisiert CPU-lastige Jobs gegenüber I/O-Operationen. Wenn ein Thread den GIL freigegeben hat und zwei Threads warten, erhält der Thread den GIL, der eine CPU-lastige Aufgabe ausführen muss.

Fazit

Glückwunsch, du hast das Tutorial abgeschlossen.

Dieses Tutorial hat ein fortgeschrittenes Thema behandelt und sollte dir einen theoretischen Überblick geben, wie der GIL in Python funktioniert. Da wir keine Programmierbeispiele zu GIL und Threads durchgegangen sind, empfiehlt sich als Übung: Erstelle mehrere Threads und eine Methode, die eine I/O-intensive Aufgabe ausführt, und analysiere anschließend, wie der GIL zwischen den Threads wechselt.

Stell gern Fragen zu diesem Tutorial unten in den Kommentaren.

Referenzen:

Wenn du gerade erst mit Python startest und mehr lernen möchtest, schau dir den DataCamp-Kurs Introduction to Data Science in Python an.

Themen
Python

Python Courses

Kurs

Einführung in Python

4 Std.
7M
Lerne in nur vier Stunden die Grundlagen der Datenanalyse mit Python und entdecke beliebte Python-Pakete.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow