11

私たちは皆、 GILの恐ろしさを認識しており、モジュールを使用する適切な時期について多くの議論を見てきましたがmultiprocessing、Python でスレッド化するとき (フォーカス主に CPython で) が正しい答えです。

GIL が重大なボトルネックにならない例は何ですか? スレッド化が最も適切な答えであるユースケースのタイプは何ですか?

4

4 に答える 4

14

スレッド化は、多くのブロッキング I/O が行われている場合にのみ意味があります。その場合、他のスレッドが動作している間に一部のスレッドがスリープ状態になることがあります。スレッドが CPU バウンドの場合、マルチスレッド化による利点はあまり見られません。

マルチプロセッシングモジュールは、コーディングがより困難ですが、個別のプロセスを使用するため、GIL の欠点を被らないことに注意してください。

于 2012-01-24T21:32:46.973 に答える
10

あなたは例を探しているように見えるので、CPU バウンドおよび I/O バウンドの例を検索することから得た、頭のてっぺんからいくつかを以下に示します (多くは見つからないようです)。私は専門家ではないので、間違って分類したものは自由に修正してください。また、技術の進歩により、問題が別のカテゴリに移動する可能性があることも注目に値します。

CPU バウンド タスク (使用multiprocessing)

  • 数学関数の数値的方法/近似 (円周率の桁数の計算など)
  • 画像処理
  • 畳み込みの実行
  • グラフィックス プログラミングのための変換の計算 (おそらく GPU によって処理されます)
  • オーディオ/ビデオの圧縮/解凍

I/O バウンド タスク (threadingおそらく問題ありません)

  • ネットワーク経由でデータを送信する
  • ディスクへの書き込み/ディスクからの読み取り
  • ユーザー入力の要求
  • オーディオ/ビデオ ストリーミング
于 2012-01-24T21:55:00.170 に答える
2

GIL は、Pythonが複数のスレッドを実行するのを防ぎます。

コードが C 拡張機能にジャンプする前に GIL を解放すると、C コードの実行中に他の Python スレッドを続行できます。ブロッキングIOと同様に、他の人が言及しています。

Ctypes はこれを自動的に行い、numpy もそうします。したがって、コードでそれらを頻繁に使用する場合、GIL によって大幅に制限されない可能性があります。

于 2012-01-24T22:37:59.493 に答える
0

CPU バウンドおよび I/O バウンドのタスクに加えて、さらに多くのユース ケースがあります。たとえば、スレッドは並行タスクを有効にします。多くの GUI プログラミングがこのカテゴリに分類されます。メイン ループは、マウス イベントに応答する必要があります。そのため、時間がかかるタスクがあり、UI をフリーズしたくない場合はいつでも、別のスレッドで実行します。パフォーマンスについてではなく、並列処理についてです。

于 2012-01-24T22:25:09.753 に答える