最近、Pythonのマルチスレッドについて読んでいます。「Pythonのマルチスレッドは役に立たない、マルチプロセスが推奨されている!」というベテランの意見をよく聞きます。なんでそんなこというの?
あなたはそれがどのように起こるのかを知らなければなりません、そしてなぜそうなるのかも知っていなければなりません。そこで、以下の詳細な調査を行います:
まず第一に、背景を強調します:
1. GIL とは何ですか? GIL の正式名称は Global Interpreter Lock (グローバル インタープリター ロック) で、そのソースは Python 設計の開始時に考慮され、データ セキュリティのために行われた決定です。
2. 各 CPU は同時に 1 つのスレッドのみを実行できます (シングルコア CPU でのマルチスレッドは、実際には同時実行のみであり、並列処理ではありません。同時実行と並列処理はどちらも、マクロからの複数のリクエストを同時に処理するという概念です)ただし、同時実行と並列処理には違いがあります。並列処理とは、2 つ以上のイベントが同時に発生することを意味します。同時実行とは、2 つ以上のイベントが同じ時間間隔で発生することを意味します。)
イベントが発生します。 スレッドの実行方法:
1. GIL を取得します。
2. スリープするか、Python 仮想マシンが一時停止するまでコードを実行します。
3. GIL を解放する
スレッドが実行したい場合は、まず GIL を取得する必要があることがわかります。Python プロセスには GIL が 1 つだけあります。 。パスを取得できないスレッドは、実行のために CPU に入ることができません。
Python2 では、このカウントは sys.setcheckinterval) を通じて調整して解放できます。
GIL ロックが解放されるたびに、スレッドがロックを奪い合ってスレッドを切り替え、リソースを消費します。また、GIL ロックのため、Python のプロセスは同時に 1 つのスレッドしか実行できません (GIL を取得したスレッドが実行できます)。これが、マルチコア CPU 上で Python のマルチスレッド効率が高くない理由です。
では、Python のマルチスレッドはまったく役に立たないのでしょうか?
ここで機密事項を説明します:
1. CPU を大量に使用するコード (さまざまなループ処理、カウントなど) この場合、大量の計算作業により、ティック数がすぐにしきい値に達します。 GIL の解放と再競合をトリガーします (複数のスレッド間での切り替えは確実にリソースを消費します)。そのため、Python でのマルチスレッドは CPU を集中的に使用するコードには適していません。
2. IO 集中型のコード (ファイル処理、Web クローラーなど) の場合、マルチスレッドは効率を効果的に向上させることができます (単一スレッドで IO 操作がある場合、IO 待機が発生し、不必要な時間の無駄が発生します)。マルチスレッドを有効にすると、スレッド A の効率が効果的に向上します。待機中は自動的にスレッド B に切り替わり、CPU リソースを無駄にせず、プログラムの実行効率が向上します。したがって、Python のマルチスレッドは IO 集中型のコードに適しています。
python3では、同時に実行できるスレッドが1つしかないという問題が発生し、効率がまだ不十分です。
注意: マルチコア マルチスレッドはシングルコア マルチスレッドよりも劣ります。その理由は、マルチスレッドが単一コアで実行されると、GIL が解放されるたびにスレッドがウェイクアップするためです。 up は GIL ロックを取得できるため、シームレスに実行できますが、マルチコアでは、CPU0 が GIL を解放した後、他の CPU 上のスレッドが競合しますが、CPU0 によってすぐに GIL が取得されるため、他のいくつかの CPU でスレッドが起動される可能性があります。切り替え時刻まで起きてからスタンバイ状態に移行すると、スレッドのスラッシングが発生し、効率が低下します
元の質問に戻ります。「Python でマルチコア CPU を最大限に活用したい場合は、マルチプロセスを使用する必要があります。」というベテランの声をよく聞きます。その理由は何ですか?
その理由は、各プロセスが独立したGILを持ち、互いに干渉しないため、本当の意味で並列実行できるため、Pythonではマルチプロセスの方が実行効率が良いからです。マルチスレッドの(マルチコア CPU のみ)。
結論は次のとおりです。マルチコアで並列処理を実行して効率を向上させたい場合、より一般的な方法は複数のプロセスを使用することです。これにより、実行効率が効果的に向上します
」という言葉をよく聞きます。