2017-04-23 14 views
2

私は、GILのためにPythonでスレッディングを使用するのは良い方法ではないと言われました。私はスレッドを作成するオーバーヘッドは物事を遅くし、最終的に単一のスレッドアプリケーションよりも遅くすると思う。 次に、なぜPythonはスレッドライブラリを持っていますか?あなたはスレッドをいつ使うべきですか?いつPythonでスレッディングを使用しますか?

+1

スレッドがコンピュートバウンドプロセスのためには役立ちません。幸いにも、それはWebアプリケーションのようなI/Oバウンドプロセスで多くの助けになります。 – kindall

答えて

0

GILを(私のpython3を想定しています)はパイソン自体の問題ではないCPythonの実装においてメモリ管理がスレッドセーフではないとして、それは、そのcpython実装の問題です。

Cpythonは、Pythonインタープリタ上でグローバルロックで実装されています。そのため、特定のPython CPUバインド操作を特定のインタープリタで実行することができます。だから、あなたがシングル/マルチスレッドを実行していても、それはまったく同じです。

しかし、データベースクエリやファイル操作のように、Pythonコードが実際に実行されないI/Oバインドタスクがあると想像すると、multithreadingで大きな恩恵を受けることができます。

+0

これに加えて、私は最近、ステッパーモーターを動かすためにPythonスレッディングを使用しました。モータを1ステップずつ繰り返して実行している間に機能をブロックしたくないので、別のスレッドを使用してモータを連続的に実行しました。 – Sawyer

1

@kindallが彼のコメントで回答を与えました。

マルチスレッドは、処理を高速化する魔法のツールではありません。同時に複数のスレッドをシステムに存在させる方法です。 は、計算上の処理のために複数のコアで処理を分割するために使用できます(これは、グローバルインタープリタロックのためにCPythonにはありません)。しかし、これはIOバインド処理にも使用できます。一方のスレッドは実行され、残りのスレッドはIO完了を待機します。その良い例は、各スレッドが異なるクライアント接続を提供できるマルチスレッドTCPサーバーです。 GILは既にioレベルでブロックされているスレッドをブロックする理由がないので、CPythonの実装は良いです。

そして、ちょうど一般的なマルチスレッドに終了するには:それは、メモリバインド処理に使用しないでん...