2017-06-28 3 views
2

私はPythonでマルチスレッド化されたコードが初めてです。私の現在の知識では、複数のスレッドがシステム内で同時に生成されることがありますが、2つの異なるスレッドは同じリソースに同時にアクセスしたり変更したりすることはできません。私は多くのスレッドを作成し、キューに入れるなどの多くのことを試みました。しかし、いつも私はマルチスレッドをPythonで利用できないと言っていましたが、代わりにマルチプロセッシングを使用してマルチコアを利用することができます。Pythonのマルチスレッドは神話ですか?

本当ですか? pythonスレッドは本当のマルチスレッドではない緑のスレッドだけですか?私はパイソンのリソースロックについて正しいですか?

ありがとうございました

+1

使用するPythonの実装によって異なります。 –

+0

@ジョンゴードンあなたは具体的にお願いしますか?私はちょうどそこにJavaのようなPythonのマルチスレッド機能が存在することを尋ねている? –

+0

"Python"と "Java" *は言語*です。彼らは抽象的なものです。具体的なPython *の実装について質問する必要があります。ですから、あなたはCPython、PyPy、Jython、IronPythonについて話していますか? –

答えて

2

Pythonでのマルチスレッドは神話のようなものです。

複数のスレッドが同じリソースに同時にアクセスしようとすることは、技術的には何も禁止されていません。結果は通常望ましくないので、ロック、mutex、リソースマネージャなどが開発されました。これらは、一度に1つのスレッドだけが特定のリソースにアクセスできるようにするためのさまざまな方法です。本質的に、彼らは一緒に素敵なスレッドを作る。しかし、多くのスレッドの時間がリソースを待つのに費やされた場合、マルチスレッドの利点は得られません。代わりにシングルスレッドのプログラムを書く方が良いでしょう。 。

CPython(最も普及しているPythonの実装 - https://python.orgのダウンロードボタンをクリックするか、パッケージマネージャーを経由して得られるもの)では、Global Interpreter Lock(GIL)という邪悪な必要性があります。 CPythonの動的メモリ管理を正しく機能させるために、GILは複数のスレッドが同時にPythonコードを実行するのを防ぎます。これは、CPythonの動的メモリ管理はスレッドセーフではないため、複数のスレッドが同じリソースに同時にアクセスする(または悪化させる)という同じ問題を抱えている可能性があります。 GILは、マルチスレッドコードを許可せず、動的メモリ管理を非常に大きくかつ遅くするという2つの極端な点の間の妥協点であった。 (JythonIronPythonではなくPyPyなど)

他の実装は、彼らが(IronPythonのためのJythonのためのJava、.NET)上に構築されているプラ​​ットフォームは異なり、動的メモリ管理を扱うので、GILを持っており、その安全にすることができませんPythonコードを複数のスレッドで同時に実行します。

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


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

3

いいえ、Pythonにはマルチスレッドがあります。実際には、システムスレッドを使用します。問題は、使用可能なコアを複数使用できないことです。これは、GIL(Global Interpreter Lock).と呼ばれるものが原因です。デッドロックや競合状態を引き起こす可能性のあるCPUバインドタスクとは対照的に、PythonスレッドはI/Oバウンドタスクでは引き続き機能します。多くのPythonライブラリは、Cエクステンソンを使用してGILをバイパスすることでこの問題を解決しています。もちろん、これはCPythonの場合すべてです。

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

Thinking about concurrency, Raymond Hettinger

今、あなたはすべてのコアの利益を得るためにマルチプロセッシングを使用することがはるかに優れている、正しいです。しかしスレッドよりもずっと少ないコアがあります。コアは貴重なリソースであり、多くのメモリを消費します。 IPC(Interprocess Communication)を扱っても大丈夫です。

+0

マルチプロセッシングのためにIPCを実装する必要はありません - [Pythonはあなたのために行います](https://docs.python.org/3/library/multiprocessing.html#exchanging-objects-between-processes)。 – Mego

+0

* nitpick *これはCPythonの実装に固有です。例えば、IronPythonのランタイムとJythonランタイムは、 'threading'を使ったマルチコアの並列化をサポートします –

+0

Pythonは複数のコアを使用することはできません。私は間違っていない複数のコアでマルチプロセッシングの仕事は右ですか? –

関連する問題