私たちは皆、 GILの恐ろしさを認識しており、モジュールを使用する適切な時期について多くの議論を見てきましたがmultiprocessing
、Python でスレッド化するとき (フォーカス主に CPython で) が正しい答えです。
GIL が重大なボトルネックにならない例は何ですか? スレッド化が最も適切な答えであるユースケースのタイプは何ですか?
私たちは皆、 GILの恐ろしさを認識しており、モジュールを使用する適切な時期について多くの議論を見てきましたがmultiprocessing
、Python でスレッド化するとき (フォーカス主に CPython で) が正しい答えです。
GIL が重大なボトルネックにならない例は何ですか? スレッド化が最も適切な答えであるユースケースのタイプは何ですか?
スレッド化は、多くのブロッキング I/O が行われている場合にのみ意味があります。その場合、他のスレッドが動作している間に一部のスレッドがスリープ状態になることがあります。スレッドが CPU バウンドの場合、マルチスレッド化による利点はあまり見られません。
マルチプロセッシングモジュールは、コーディングがより困難ですが、個別のプロセスを使用するため、GIL の欠点を被らないことに注意してください。
あなたは例を探しているように見えるので、CPU バウンドおよび I/O バウンドの例を検索することから得た、頭のてっぺんからいくつかを以下に示します (多くは見つからないようです)。私は専門家ではないので、間違って分類したものは自由に修正してください。また、技術の進歩により、問題が別のカテゴリに移動する可能性があることも注目に値します。
multiprocessing
)threading
おそらく問題ありません)GIL は、Pythonが複数のスレッドを実行するのを防ぎます。
コードが C 拡張機能にジャンプする前に GIL を解放すると、C コードの実行中に他の Python スレッドを続行できます。ブロッキングIOと同様に、他の人が言及しています。
Ctypes はこれを自動的に行い、numpy もそうします。したがって、コードでそれらを頻繁に使用する場合、GIL によって大幅に制限されない可能性があります。
CPU バウンドおよび I/O バウンドのタスクに加えて、さらに多くのユース ケースがあります。たとえば、スレッドは並行タスクを有効にします。多くの GUI プログラミングがこのカテゴリに分類されます。メイン ループは、マウス イベントに応答する必要があります。そのため、時間がかかるタスクがあり、UI をフリーズしたくない場合はいつでも、別のスレッドで実行します。パフォーマンスについてではなく、並列処理についてです。