python GIL の存在は、python マルチスレッドで同じ操作が単一スレッドでの繰り返しとそれほど変わらないことを意味しますか?
たとえば、2 つのファイルをアップロードする必要がある場合、1 つずつアップロードするのではなく、2 つのスレッドで行う利点は何ですか?
私は両方の方法で大きな数学演算を試みました。しかし、完了するまでにほぼ同じ時間がかかるようです。
これは私には不明確なようです。誰かがこれについて私を助けることができますか?. ありがとう。
python GIL の存在は、python マルチスレッドで同じ操作が単一スレッドでの繰り返しとそれほど変わらないことを意味しますか?
たとえば、2 つのファイルをアップロードする必要がある場合、1 つずつアップロードするのではなく、2 つのスレッドで行う利点は何ですか?
私は両方の方法で大きな数学演算を試みました。しかし、完了するまでにほぼ同じ時間がかかるようです。
これは私には不明確なようです。誰かがこれについて私を助けることができますか?. ありがとう。
Python のスレッドは、当然のことながらわずかに悪いラップを取得します。それらが実際にあなたに利益をもたらす3つの(まあ、2.5)ケースがあります:
Python 以外のコード (C ライブラリ、カーネルなど) が実行されている場合、他の Python スレッドは引き続き実行できます。一度に 2 つのスレッドで実行できないのは、純粋な Python コードだけです。したがって、ディスクまたはネットワーク I/O を実行している場合、ほとんどの時間が Python 自体の外部で費やされるため、スレッドによって実際に何かが得られます。
GIL は実際にはPythonの一部ではなく、 CPythonの実装の詳細です(コア Python 開発者が取り組んでいる「参照」実装であり、通常、Linux ボックスなどで「python」を実行するだけで取得できます。
Jython、IronPython、およびその他の Python の再実装には通常GILがなく、複数の純粋な Python スレッドを同時に実行できます。
0.5 のケース: 完全に純粋な Python を使用していて、スレッド化によるパフォーマンス上の利点がほとんど、またはまったくない場合でも、開発者の時間とスレッドで解決する難しさの点で、いくつかの問題は非常に便利です。もちろん、これは開発者にも依存します。
使用しているライブラリに大きく依存します。GIL は、Python オブジェクトとその内部データ構造が同時に変更されるのを防ぐためのものです。アップロードを行っている場合、実際のアップロードを行うために使用するライブラリは、実際の HTTP リクエストが完了するのを待っている間に GIL を解放する可能性があります (標準ライブラリの HTTP モジュールの場合はそうであると思いますが、私はチェックしていません)。
補足として、本当に並行して実行したい場合は、複数のプロセスを使用してください。これにより、多くの手間が省け、より優れたコード (より堅牢で、よりスケーラブルで、おそらくより適切に構造化されたもの) が得られます。
実行中のネイティブ コード モジュールによって異なります。ネイティブ モジュールは GIL を解放してから、別のスレッドが GIL をロックできるように独自の処理を実行できます。GIL は通常、コード (Python とネイティブの両方) が Python オブジェクトで動作している間保持されます。詳細が必要な場合は、おそらくそれについてかなり読んでみる必要があります。:)
参照: グローバル インタープリター ロック (GIL) とは? およびスレッド状態とグローバル インタープリター ロック
マルチスレッドとは、2 つ以上のタスクを同時に完了する必要があるという概念です。たとえば、このアプリケーションにはワード プロセッサがあり、N 個の並列タスクを実行する必要があります。キーボードを聞いたり、入力テキストをフォーマットしたり、フォーマットされたテキストをディスプレイユニットに送信したりするのと同じです。このような順次処理のコンテキストでは、時間がかかり、1 つのタスクが次のタスクの完了まで待たなければなりません。したがって、これらのタスクをスレッドに入れ、同時にタスクを完了します。3 つのスレッドが常に起動し、入力が到着するのを待ってから、その入力を受け取り、同時に出力を生成します。
したがって、マルチコアとプロセッサがあれば、マルチスレッドはより高速に動作します。しかし、実際にはシングル プロセッサでは、スレッドは次々と動作しますが、実行速度はより速く感じられます。実際には、一度に 1 つの命令が実行され、プロセッサは一度に数十億の命令を実行できます。そのため、コンピューターは、マルチタスクまたはスレッドが並行して動作しているような錯覚を引き起こします。それは単なる幻想です。