web-dev-qa-db-ja.com

python=のマルチスレッドは神話ですか?

私の知る限りでは、システム内で複数のスレッドを同時に生成できますが、2つの異なるスレッドが同じリソースに同時にアクセスしたり変更したりすることはできません。私は多くのスレッドを作成し、それらをキューに入れるなど、多くのことを試しました。しかし、常にPythonではマルチスレッド化は利用できず、代わりにマルチプロセッシングを使用してマルチコアCPUの利点。

これは本当ですか? Pythonスレッドはグリーンスレッドのみで、実際のマルチスレッドではありませんか?Pythonのリソースロックについて私は正しいですか?

11
binu.py

いいえ、Pythonにはマルチスレッド機能があります。実際には、システムスレッドを使用します。問題は、使用可能なコアを1つしか使用できないことです。これは、 [〜#〜] gil [〜#〜]グローバルインタープリターロック Pythonスレッドは、デッドロックや競合状態を引き起こす可能性のあるCPUバウンドタスクとは対照的に、I/Oバウンドタスクでも機能します。多くのPythonライブラリは、C拡張機能を使用してGILをバイパスすることでこの問題を解決します。もちろん、これはすべてCPythonの場合です。

Pythonのコア開発者の一人がこれについて非常に興味深い話をしています。

同時実行について考える、レイモンド・ヘッティンガー

正解です。すべてのコアの利点を活用するには、マルチプロセッシングを使用する方がはるかに優れています。ただし、コアの数はスレッドの数よりもはるかに少ないです。コアは貴重なリソースであり、大量のメモリを消費します。 IPC(プロセス間通信) を扱うことを気にしなければ、それは素晴らしい解決策です。

9
daegontaven

Pythonのマルチスレッド化は一種の神話です。

技術的には、複数のスレッドが同時に同じリソースにアクセスしようとすることを禁じているわけではありません。結果は通常望ましくないため、ロック、ミューテックス、リソースマネージャなどが開発されました。これらはすべて、一度に1つのスレッドのみが特定のリソースにアクセスできるようにするためのさまざまな方法です。本質的に、それらはスレッドを一緒に素敵にプレイさせます。ただし、スレッドの時間の多くがリソースの待機に費やされている場合、マルチスレッドのメリットは得られず、代わりにシングルスレッドプログラムを作成する(または、待機を回避するようにプログラムを再構築する)方がよいでしょう。 。

そうは言っても、CPython(最も普及しているPython実装- https://python.org のダウンロードボタンをクリックするか、パッケージを介して取得する実装)マネージャ)、 Global Interpreter Lock (GIL)と呼ばれるこの邪悪な必要性があります。CPythonで動的メモリ管理を正しく機能させるために、GILは複数のスレッドの実行を防止しますPythonコードを同時に実行します。これは、CPythonの動的メモリ管理がスレッドセーフではないためです。複数のスレッドが同じリソースに同時にアクセスする(または、さらに悪いことに、破棄する)のと同じ問題が発生する可能性があります。GILは、マルチスレッドコードを許可しないという両極端の妥協案、および動的なメモリ管理が非常に大きくて遅い。

他の実装( JythonIronPython ではなく PyPy など)は、GILを備えていません。 Jython、.NET for IronPython)は動的メモリ管理を異なる方法で処理するため、Pythonコードを複数のスレッドで同時に安全に実行できます。

CPythonを使用している場合は、代わりに multiprocessing モジュールを使用することを強くお勧めします。複数のスレッドを実行するのではなく、複数のプロセスを実行します(それぞれに独自のGILがあるため、すべてを同時に実行できます)。マルチスレッドよりもはるかに効果的です。ネイティブコードはGILの影響を受けないため、代わりにC/C++でマルチスレッドコードを拡張機能として記述します。ただし、これは通常、はるかに多くの作業であり、通常、その見返りは努力する価値がありません。


緑のスレッドについて:彼らは通常の意味でマルチスレッドを実装していません。 緑のスレッドコルーチン に近いので、(通常)複数のプロセッサコアを利用して真の並列で実行することはできません。代わりに、通常は cooperative multitasking を実装します。各グリーンスレッドは手動で別のグリーンスレッドに制御を渡します。 Stackless Python にはグリーンスレッドのサポートが組み込まれており、 greenlet 拡張機能によってCThreadにそれらがもたらされます。グリーンスレッドを実装する他のライブラリ/モジュールはおそらく他にもありますが、私は他のライブラリについてはよく知りません。

8
user2508324