Frage

Ich hoffe, dass jemand einen Einblick, zur Verfügung stellen kann, was über die Java Virtual Machine grundlegend anders ist, dass es Fäden schön, ohne die Notwendigkeit für eine globale Interpreter Lock (GIL) implementieren können, während Python ein solches Übel erfordert.

War es hilfreich?

Lösung

Python (die Sprache) braucht keine GIL (weshalb es perfekt auf JVM [Jython] und .NET [Ironpython] umgesetzt werden, und die Implementierungen Multi-Thread-frei). (Bes. Die Codierung der Garbage-Collection-Mechanismen) CPython (die beliebte Implementierung) hat immer eine GIL zur Vereinfachung der Codierung und der Integration von Nicht-thread-safe C codierten Bibliotheken (es verwendet werden, um eine Tonne von denen um verwendet wird; -).

Die unb Projekt unter anderem ehrgeizigen Zielen, tut Plan eine GIL-freie virtuelle Maschine für Python - diese Site zu zitieren: „Zusätzlich wir beabsichtigen, die GIL und befestigen Sie den Zustand von Multithreading in Python zu entfernen. wir glauben, dass dies möglich ist, durch die Umsetzung eines komplizierteren GC-System, so etwas wie IBMs Recycler (Bacon et al, 2001). "

Andere Tipps

Die JVM (mindestens Hotspot) hat ein ähnliches Konzept mit dem „GIL“, es ist nur viel feiner in seiner Sperrgranularität, die meisten davon stammen aus der GC in Hotspot, die weiter fortgeschritten sind.

In CPython es ist ein großes Schloss (wahrscheinlich nicht wahr, aber gut genug für Argumente willen), in der JVM, es ist mehr Verbreitung über mit unterschiedlichen Konzepten je nachdem, wo sie verwendet wird.

Werfen Sie einen Blick auf, zum Beispiel vm / runtime / safepoint.hpp im Hotspot-Code, der effektiv eine Barriere ist. Einmal an einem Sicherungspunkt der gesamte VM hat in Bezug auf Java-Code angehalten, ähnlich wie die Python-VM hält an der GIL.

In der Java-Welt solche VM Pausieren Ereignisse bekannt sind als „Stop-the-world“, an diesen Stellen nur nativen Code, den bestimmten Kriterien gebunden ist, freilaufend ist, hat der Rest der VM gestoppt wurde.

Auch das Fehlen einer groben Sperre in Java macht JNI viel schwieriger zu schreiben, da die JVM weniger Garantien über seine Umgebung macht für FFI nennt, eines der Dinge, dass CPython ziemlich einfach macht (wenn auch nicht so einfach wie mit ctypes ).

Es gibt einen Kommentar unten in diesem Blog-Eintrag http://www.grouplens.org/node/ 244 , die auf dem Grund Hinweise, warum es so einfach Abgabe mit einem GIL für Ironpython oder Jython war, ist es, dass CPython Referenzzählung verwendet, während die anderen 2 VMs Müllsammler haben.

Die genauen Mechanismen, warum dies so komme ich nicht, aber es klingt wie ein plausibler Grund.

In diesem Link rel="nofollow sie haben die folgende Erklärung:

... „Teile der Interpreter nicht thread, obwohl vor allem, weil sie alle THREAD durch massive Sperre Nutzung machen würde verlangsamen Single-Threaded extrem ( Quelle ). Dies scheint auf den CPython Garbage Collector mit Referenzzählung (die bezogen werden JVM und CLR nicht, und müssen daher nicht eine Referenz jedes Mal zählen) sperren / freizugeben. Aber selbst wenn jemand von einer akzeptablen Lösung gedacht und umgesetzt es würden Bibliotheken von Drittanbietern noch die gleichen Probleme haben. "

Python fehlt jit / aot und der Zeitrahmen es bei Multithreaded-Prozessoren geschrieben wurde, gab es nicht. Alternativ können Sie alles in Julia lang neu kompilieren, die ein gewissen Geschwindigkeitsschub auf dem Python-Code GIL und gewinnen fehlt. Auch Art von Jython saugt es ist langsamer als CPython und Java. Wenn Sie Python halten wollen betrachten parallel Plugins verwenden, werden Sie nicht einen sofortigen Geschwindigkeitsschub gewinnen, aber Sie können mit dem richtigen Plugin parallele Programmierung tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top