Python (die Sprache) benötigt keine GIL (weshalb es perfekt auf JVM [Jython] und .NET [IronPython] implementiert werden kann und diese Implementierungen frei multithread-fähig sind). CPython (die beliebte Implementierung) hat immer eine GIL verwendet, um die Codierung (insbesondere die Codierung der Garbage Collection-Mechanismen) und die Integration nicht thread-sicherer C-codierter Bibliotheken zu vereinfachen (früher gab es eine Menge davon). -).
Das unb Projekt unter anderem ehrgeizigen Zielen, tut plant eine GIL-freie virtuelle Maschine für Python -. , Dass die Website zu zitieren : „Darüber hinaus wollen wir die GIL entfernen und den Zustand von Multithreading in Python beheben Wir glauben , dies ist möglich durch die Implementierung eines ausgefeilteren GC-Systems, ähnlich wie IBMs Recycler (Bacon et al., 2001). "
Die JVM (zumindest der Hotspot) hat ein ähnliches Konzept wie die "GIL", sie ist nur viel feiner in ihrer Lock-Granularität. Das meiste davon stammt von den GCs im Hotspot, die weiter fortgeschritten sind.
In CPython ist es eine große Sperre (wahrscheinlich nicht so wahr, aber gut genug für Argumente), in der JVM ist es mit unterschiedlichen Konzepten mehr verbreitet, je nachdem, wo es verwendet wird.
Schauen Sie sich zum Beispiel vm / runtime / safepoint.hpp im Hotspot-Code an, der praktisch eine Barriere darstellt. An einem sicheren Punkt hat die gesamte VM in Bezug auf Java-Code angehalten, ähnlich wie die Python-VM an der GIL angehalten hat.
In der Java-Welt werden solche VM-Pausenereignisse als "Stop-the-World" bezeichnet. An diesen Punkten läuft nur nativer Code, der an bestimmte Kriterien gebunden ist, frei, der Rest der VM wurde gestoppt.
Auch das Fehlen einer groben Sperre in Java erschwert das Schreiben von JNI erheblich, da die JVM weniger Garantien für ihre Umgebung für FFI-Aufrufe gibt. Dies ist eines der Dinge, die cpython ziemlich einfach macht (obwohl es nicht so einfach ist wie die Verwendung von ctypes).
quelle
Unten in diesem Blog-Beitrag http://www.grouplens.org/node/244 gibt es einen Kommentar, der auf den Grund hinweist, warum es so einfach war, auf eine GIL für IronPython oder Jython zu verzichten. CPython verwendet die Referenzzählung Die anderen 2 VMs haben Garbage Collectors.
Die genaue Mechanik, warum das so ist, verstehe ich nicht, aber es klingt nach einem plausiblen Grund.
quelle
In diesem Link haben sie die folgende Erklärung:
... "Teile des Interpreters sind nicht threadsicher, allerdings hauptsächlich, weil sie alle Threadsicher durch massive Sperrenutzung extrem verlangsamen würden ( Quelle ). Dies scheint mit dem CPython-Garbage-Collector unter Verwendung der Referenzzählung (der JVM) in Zusammenhang zu stehen und CLR nicht und müssen daher nicht jedes Mal einen Referenzzähler sperren / freigeben. Aber selbst wenn jemand an eine akzeptable Lösung dachte und diese implementierte, hätten Bibliotheken von Drittanbietern immer noch die gleichen Probleme. "
quelle
Python fehlt jit / aot und der Zeitrahmen, in dem es auf Multithread-Prozessoren geschrieben wurde, existierte nicht. Alternativ können Sie alles in Julia lang neu kompilieren, dem GIL fehlt, und Ihren Python-Code etwas beschleunigen. Auch Jython saugt es ist langsamer als Cpython und Java. Wenn Sie sich an Python halten möchten, sollten Sie parallele Plugins verwenden. Sie erhalten keinen sofortigen Geschwindigkeitsschub, können jedoch mit dem richtigen Plugin parallel programmieren.
quelle