質問

Pythonギルの存在は、Pythonマルチスレッドで 同じ 操作は、単一のスレッドで繰り返すこととそれほど違いはありませんか?

たとえば、2つのファイルをアップロードする必要がある場合、次々にアップロードする代わりに2つのスレッドでそれらを実行する利点は何ですか?

私は両方の方法で大きな数学の操作を試みました。しかし、彼らは完了するのにほぼ等しい時間を要するようです。

これは私には不明のようです。誰かがこれについて私を助けることができますか?ありがとう。

役に立ちましたか?

解決

Pythonのスレッドは、彼らが値するよりもわずかに悪いラップを取得します。彼らが実際にあなたに利益を得る3つの(まあ、2.5)ケースがあります:

  • Python以外のコード(Cライブラリ、カーネルなど)が実行されている場合、他のPythonスレッドは実行を続けることができます。 2つのスレッドで一度に実行できないのは、純粋なPythonコードのみです。したがって、ディスクまたはネットワークI/Oを行っている場合、ほとんどの時間はPython自体の外で費やされているため、スレッドは実際に何かを購入できます。

  • ギルは実際にはその一部ではありません Python, 、それはの実装の詳細です cpython (コアPython開発者が作業し、Linuxボックスなどで「Python」を実行するだけで取得する「参照」の実装。

    Jython、Ironpython、およびPythonのその他の再実装は一般的に行います いいえ ギルと複数の純粋なパイソンスレッドを持っています できる 同時に実行します。

  • 0.5ケース:あなたが完全に純粋なパイソンであり、スレッドのパフォーマンスのメリットがほとんどないか、まったくないと見ていても、いくつかの問題は、開発者の時間とスレッドで解くのが難しいという点で本当に便利です。もちろん、これは開発者にも依存します。

他のヒント

それは本当にあなたが使用しているライブラリに依存します。 GILは、Pythonオブジェクトとその内部データ構造が同時に変更されるのを防ぐことを目的としています。アップロードを行っている場合、実際のアップロードを実行するために使用するライブラリは、実際のHTTPリクエストが完了するのを待っている間にGILをリリースする可能性があります(標準ライブラリのHTTPモジュールの場合はそうですが、チェックしなかった)。

サイドノートとして、本当に並行して物事を実行したい場合は、 複数のプロセスを使用します. 。それはあなたに多くのトラブルを節約し、あなたはより良いコード(より堅牢で、よりスケーラブルで、そしておそらくより良い構造)になります。

実行中のネイティブコードモジュールに依存します。ネイティブモジュールは、ギルをリリースしてから、オフにして独自のことを行い、別のスレッドがギルをロックできるようにします。 GILは通常、Pythonとネイティブの両方のコードがPythonオブジェクトで動作している間に保持されます。詳細が必要な場合は、おそらく行ってそれについてかなり読む必要があります。 :)

見る:グローバルインタープリターロック(GIL)とは何ですか?スレッド状態とグローバルインタープリターロック

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top