? Wenn Sie mit Python gearbeitet haben und starten wollen experimentieren mit fortgeschrittenen Programmiertechniken , das Lernen über globale Interpreter Lock ( GIL ) ist eine gute Idee . GIL ist ein Algorithmus, der die Ausführung von mehreren Threads in einem Python-Programm behandelt. GIL ist eine Voraussetzung , wenn man mit mehreren Threads arbeiten, weil CPython Speicher -Management ist nicht Thread-sicher . Darüber hinaus hat die GIL bekannt, dass eine Leistung von Programmen abzubauen. Ein Beispiel ist, dass es länger dauern, zwei Threads , die gleiche Funktion als ein Thread Aufruf der Funktion zweimal aufrufen . Mit GIL
In einer multi-threaded Python-Programm ein Thread nicht sicher zugreifen können Python-Objekte , wenn der GIL vom aktuellen Thread gehalten wird. Die GIL stellt sicher, dass beide Threads richtig Aktualisierung der Objekt-Referenzen genannt . So starten Sie mit dem GIL müssen Sie die Thread-Zustand in einem Ort Variablen speichern und lassen Sie die globale Interpreter Lock . An dieser Stelle können Sie Ihre Sperrung durchführen Eingabe /Ausgabe-Operation und Wiedererlangung der globalen Interpreter Lock , wenn es fertig ist . Schließlich , stellen Sie die Thread-Zustand von der lokalen Variablen . Sie können das folgende Makro beispielsweise den Prozess zu vereinfachen :
Py_BEGIN_ALLOW_THREADS ... Tun Sie etwas Blockierung I /O-Operation ... Py_END_ALLOW_THREADS
Berufung Python -Code
Oft Fäden aus anderen Programmiersprachen wie C erstellt und wenn Sie aufrufen müssen mehrere Themen , dann müssen Sie GIL verwenden . Sie müssen sich zunächst registrieren diese Fäden mit einem Dolmetscher über ein Gewinde Zustand Datenstruktur und dann erwerben die GIL . Um diesen Prozess zu vereinfachen, können Sie das " PyGILState_Ensure () " und " PyGILState_Release () "-Funktionen . Das Folgende ist ein Beispiel, wie man dieses Konzept anwenden :
PyGILState_STATE gstate ; gstate = PyGILState_Ensure ( ) ;/* Führen Python Aktionen hier . * /result = CallSomeFunction ( ) ;/* Ergebnis auswerten oder verarbeiten Ausnahme * //* Lassen Sie den Faden . Kein Python API über diesen Punkt hinaus erlaubt. * /PyGILState_Release ( gstate );
Python Threads
In Python ein Thread ist eine echte System-Thread wie jeder andere Programmausführung . Beim Ausführen eines Python Thread erzeugt eine kleine Datenstruktur mit dem Dolmetscher Zustand . Danach wird ein neuer Thread gestartet und ruft die " PyEval_CallObject . " Der letzte Schritt ist eine einfache C -Funktion, die läuft , was Python angegeben . Die GIL sorgfältig kontrolliert jeden Thread-Ausführung . Das Folgende ist ein Beispiel für eine Python thread:
Import timeimport threadingclass CountdownThread ( threading.Thread ) : def __ init__ (self , count) : threading.Thread.__init__ (Selbst-) self.count = countdef run (self ) : Während self.count > 0: print "Counting down" , self.countself.count - = 1time.sleep ( 5 ) return
GIL Probleme und Ersatz
Python -Entwickler haben die Beseitigung von GIL diskutiert , aber noch in einigen Herausforderungen führen . Ein Problem oft mit GIL erwähnt ist, dass es multithreaded CPython Programme daran hindert, alle Vorteile von Multi- Core-Prozessoren. Jede GIL Ersatz muss einfach und gleichzeitig bei der Arbeit mit Threads. Muss schneller als GIL und muss eine gute API-Kompatibilität haben . Ein Beispiel für die API-Kompatibilität ist eine gute Rückverfolgung beim Aufzählen der Objekte er auf .