Pythonでのマルチスレッドは神話のようなものです。
複数のスレッドが同じリソースに同時にアクセスしようとすることは、技術的には何も禁止されていません。結果は通常望ましくないので、ロック、mutex、リソースマネージャなどが開発されました。これらは、一度に1つのスレッドだけが特定のリソースにアクセスできるようにするためのさまざまな方法です。本質的に、彼らは一緒に素敵なスレッドを作る。しかし、多くのスレッドの時間がリソースを待つのに費やされた場合、マルチスレッドの利点は得られません。代わりにシングルスレッドのプログラムを書く方が良いでしょう。 。
CPython(最も普及しているPythonの実装 - https://python.orgのダウンロードボタンをクリックするか、パッケージマネージャーを経由して得られるもの)では、Global Interpreter Lock(GIL)という邪悪な必要性があります。 CPythonの動的メモリ管理を正しく機能させるために、GILは複数のスレッドが同時にPythonコードを実行するのを防ぎます。これは、CPythonの動的メモリ管理はスレッドセーフではないため、複数のスレッドが同じリソースに同時にアクセスする(または悪化させる)という同じ問題を抱えている可能性があります。 GILは、マルチスレッドコードを許可せず、動的メモリ管理を非常に大きくかつ遅くするという2つの極端な点の間の妥協点であった。 (JythonとIronPythonではなくPyPyなど)
他の実装は、彼らが(IronPythonのためのJythonのためのJava、.NET)上に構築されているプラットフォームは異なり、動的メモリ管理を扱うので、GILを持っており、その安全にすることができませんPythonコードを複数のスレッドで同時に実行します。
CPythonを使用している場合は、代わりにmultiprocessingモジュールを使用することを強くお勧めします。複数のスレッドを実行するのではなく、複数のプロセスを実行します(それぞれ独自のGILを使用するため、すべて同時に実行できます)。マルチスレッドよりもはるかに効果的です。代わりに、ネイティブコードがGILの影響を受けないため、C/C++でマルチスレッドコードを拡張機能として記述することもできます。しかし、それは通常はもっと多くの作業であり、その代償は通常その努力に値するものではありません。
グリーンスレッドについて:通常の意味でマルチスレッドを実装していません。 Green threadsは、coroutinesに近く、(通常は)複数のプロセッサコアを真の並列で実行することはできません。代わりに、通常はcooperative multitaskingを実装しています。ここでは、緑色のスレッドがそれぞれ別の緑色のスレッドに手動で制御を渡します。 Stackless Pythonには緑色スレッドの組み込みサポートがあり、greenlet拡張子はCPythonに持ち込みます。おそらく緑のスレッドを実装する他のライブラリ/モジュールがありますが、私は他のものに慣れていません。
使用するPythonの実装によって異なります。 –
@ジョンゴードンあなたは具体的にお願いしますか?私はちょうどそこにJavaのようなPythonのマルチスレッド機能が存在することを尋ねている? –
"Python"と "Java" *は言語*です。彼らは抽象的なものです。具体的なPython *の実装について質問する必要があります。ですから、あなたはCPython、PyPy、Jython、IronPythonについて話していますか? –