web-dev-qa-db-ja.com

Java仮想マシンにGILがないのはなぜですか?なぜPythonそんなに悪いものが必要なのですか?

グローバルインタープリターロック(GIL)を必要とせずにスレッドを適切に実装できるJava仮想マシンについて根本的に異なる点について誰かが洞察を提供できることを望んでいますが、Pythonはそのような悪を必要とします。

173
AgentLiquid

Python(言語)はGILを必要としません(そのため、JVM [Jython]および.NET [IronPython]に完全に実装でき、これらの実装はマルチスレッドに自由に対応できます)。 CPython(一般的な実装)は、コーディングの容易さ(特にガベージコレクションメカニズムのコーディング)および非スレッドセーフなCコーディングされたライブラリの統合のためにGILを常に使用しています(多くの場合、これらは使用されていました。 -)。

nladen Swallow プロジェクトは、他の野心的な目標の中でも、 plan Python-そのサイトを引用するためのGILフリーの仮想マシン、 「さらに、GILを削除し、Pythonのマルチスレッドの状態を修正する予定です。これは、IBMのRecyclerのような、より洗練されたGCシステムの実装によって可能になると考えています(Bacon et al、2001)。

219
Alex Martelli

JVM(少なくともホットスポット)には「GIL」と同様の概念があります。ロックの粒度ははるかに細かく、ほとんどはホットスポットのGCの高度なものです。

CPythonでは1つの大きなロックであり(おそらくそうではありませんが、引数としては十分です)、JVMでは使用される場所に応じてさまざまな概念で広がります。

たとえば、ホットスポットコードのvm/runtime/safepoint.hppを見てください。これは事実上障壁です。セーフポイントに到達すると、VMは、Javaコードに関して、python VMはGILで停止します。

Java world such VM一時停止イベントは「stop-the-world」として知られています。これらのポイントでは、特定の基準にバインドされたネイティブコードのみがフリーランニング、残りのVMは停止されました。

また、Javaでの粗いロックの欠如は、JNIがFFI呼び出しの環境についての保証を少なくするため、JNIの記述がはるかに難しくなります。 ctypesを使用するほど簡単ではありません)。

48
Greg Bowyer

このブログ投稿の下にコメントがあります http://www.grouplens.org/node/244 IronPythonまたはJythonのGILを簡単に省いた理由を示唆しています。 CPythonは参照カウントを使用しますが、他の2つのVMにはガベージコレクターがあります。

なぜこれが正確なのかはわからないが、もっともらしい理由のようだ。

6
user235859

この中で link には次の説明があります:

...「インタープリターの一部はスレッドセーフではありませんが、大規模なロックを使用してすべてをスレッドセーフにすると、シングルスレッドが極端に遅くなります( source )。これはCPythonのゴミに関連しているようです。参照カウントを使用するコレクター(JVMおよびCLRはそうではないため、参照カウントを毎回ロック/リリースする必要はありません)。しかし、誰かが許容できるソリューションを考えて実装したとしても、サードパーティのライブラリは同じ問題。」

0
Oliver Wilken