Java 仮想マシンに GIL がないのはなぜですか?なぜ Python にはこれほどまでに必要なのでしょうか?

StackOverflow https://stackoverflow.com/questions/991904

質問

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

役に立ちましたか?

解決

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

荷物を積んでいないツバメ このプロジェクトは、他の野心的な目標の中でもとりわけ、 プラン Python 用の GIL フリー仮想マシン -- そのサイトを引用すると、「さらに、GIL を削除し、Python のマルチスレッド状態を修正する予定です。私たちは、IBM の Recycler (Bacon et al、2001) のような、より洗練された GC システムの実装を通じてこれが可能であると信じています。」

他のヒント

JVM(少なくともホットスポット)が「GIL」に似たコンセプトを持っている、それはこれのほとんどはGCのホットスポットで、より高度であるから来て、そのロックの粒度にちょうどはるかに微細です。

CPythonのではJVMで、それが使用されている場所に応じて異なる概念を詳細スプレッドですが、一つの大きなロック(おそらく真実ではないが、引数のために十分)です。

、例えば、効果的障壁であるホットスポットコード、内のvm /ランタイム/ safepoint.hppを見てみましょう。一度セーフポイントで全体のVMは、多くのVMはGILで停止Pythonのような、Javaコードに関して停止しています。

Javaの世界では、このようなVMの一時停止のイベントがこれらの点で一定の基準にバインドされている唯一のネイティブコードは、VMの残りが停止されている、フリーランニングである。 JVMは、FFIのためにその環境に関する以下の保証は、CPythonのは(ctypesのを使用して同じように簡単ではないがかなり容易になりますことをものの一つ、呼び出しを行うと、

また、Javaでの粗いロックの欠如は、書くことがJNIがはるかに困難に)。

コメントはこのブログの記事にダウン下記ある http://www.grouplens.org/node/それはIronPythonのまたはJythonのためのGILを省くので、簡単だった理由でヒント244 のは、それが他の2つのVMはガベージコレクタを有するのに対し、CPythonのは、参照カウントを使用することである。

これはある理由の正確な仕組みは、私は得ることはありませんが、それはもっともらしい理由のような音を行います。

このリンクの彼らは、次の説明があります:

...「通訳の部品がスレッドセーフではないが、ほとんどがそれらを作るために大規模なロックの使用状況によってすべてのスレッドセーフはシングルスレッド非常に(遅いでしょうが、<のhref =」http://effbot.org/pyfaq/can -t-我々は-GET-RIDの - グローバル・インタプリタ・lock.htm」のrel = "nofollowをnoreferrer">ソースのは)。これは(参照カウントを使用してはCPythonのガベージコレクタに関連すると思わJVMとCLRはないので、)参照するたびにカウントを解放/ロックする必要はありません。しかし、誰かが受け入れ可能な解決策を考え、それを実装した場合でも、サードパーティのライブラリはまだ同じ問題を抱えているだろう。」

PythonはJIT / AOTを欠き、それはマルチスレッドプロセッサで書かれた時間枠は存在しませんでした。別の方法としては、GILを欠いジュリアLANGのすべてを再コンパイルして、Pythonのコードにいくつかの速度向上を得ることができました。また、Jythonのは、一種のそれはCPythonのとJavaよりも遅いです吸います。あなたはパラレルプラグインを使用することを検討してPythonのに固執する場合は、インスタントスピードブーストを得ることはありませんが、あなたは右のプラグインを使用して並列プログラミングを行うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top