業界が「Web スケール」のアプリケーション アーキテクチャに向かう傾向にあるため (流行語は嫌いですが)、 GILが同時実行性を処理する方法について Python が多くの批判を受け、ボトルネックになっていることを私は知っています。表面的には問題を理解していますが、他の手続き型言語が内部でスレッドをどのように処理しているかを知るには十分ではありません。Javaにも同様の問題がありますか? C#? ルビー?そうでない場合、なぜ Python は同じ戦略を採用していないのでしょうか?
1 に答える
GIL が存在するのは、(主に) CPython の参照カウントの実装に必要なためです。これはガベージ コレクションの方法です。はっきりさせておきますが、Pythonには GIL はありませんが、リファレンス実装にはあります。これは単なる実装の詳細です。
GIL が存在するのは、実装を単純かつ高速にするためであり、ほとんどの場合、それは重要ではありません。スレッド化は主に、処理と並行して遅いリソースにアクセスできるように設計されており、GIL によってまったく妨げられません。
GIL が問題になる唯一の理由は、多くの並列計算を実行したい場合です。この場合、C で拡張モジュールを作成するか、multiprocessing
モジュールを使用して GIL を回避できます。
これはすべて、99.9% の確率で GIL は実際には問題ではなく、問題がある場合でも簡単に回避できることを意味します。それが本当に妨げになる場合は、Jython を試してみてください。Jython は JVM の上に実装され、GIL を必要としないガベージ コレクションの別の方法を使用します。
いつものように、時期尚早の最適化は悪い考えです。何かを開発して GIL のせいで自分が傷ついた場合、あまり苦労せずに回避する方法があります。とは言っても、現実世界でそれが問題であることに気付く可能性はほとんどありません。これは、Python を取り巻く最も誇張されたものの 1 つです (インデント全体に次ぐものかもしれません)。