Windows ボックスで大量のデータ処理を実行するシングルスレッドの Python プログラムを実行しています。私のマシンには 8 つのプロセッサがあります。Windows タスク マネージャーの [パフォーマンス] タブで CPU 使用率を監視すると、利用可能な処理能力のごく一部しか使用していないことがわかります。1 つのプロセッサのみが最大限に使用され、残りはほとんどアイドル状態です。すべてのプロセッサが確実に使用されるようにするにはどうすればよいですか? マルチスレッドは解決策ですか?
6 に答える
マルチスレッドでは、余分なプロセッサやコアを利用できません。
新しいスレッドではなく、新しいプロセスを生成する必要があります。
このツールは、私が遭遇したすべてのツールの中で最も単純です: parallel python
概要:
PP は、SMP (複数のプロセッサまたはコアを備えたシステム) およびクラスター (ネットワーク経由で接続されたコンピューター) で Python コードを並列実行するためのメカニズムを提供する Python モジュールです。
軽量で、インストールが簡単で、他の python ソフトウェアと統合できます。
PP は純粋な Python で書かれたオープン ソースのクロスプラットフォーム モジュールです。
Jonが言ったことに加えて、標準のPythonインタープリターを使用している場合は、マルチスレッドに関する制限を理解する必要があります。スレッドが純粋なPythonであり、システムコールを行わない場合、グローバルインタープリターロックのために複数のプロセッサで同時に実行できないため、マルチスレッドのメリットは最小限に抑えられます。この場合、代わりに複数のプロセスを使用するか、グローバルインタープリターロックを持たないJPythonやIronPythonなどの別のPython実装に切り替えることをお勧めします。
マルチスレッドは単一のプロセスに必要ですが、必ずしも解決策ではありません。すべてを使用するのに十分な数のスレッドがある場合でも、プロセッサ アフィニティにより、使用可能なコアのサブセットに制限される可能性があります。
プログラムがpython のマルチプロセッシング モジュールを使用する利点があるタイプである場合、それを得ることができます
マルチプロセッシングは、GIL の問題を回避する複数の python プロセスを使用するため、これらのすべてのコアを python コードで使用できます。簡単なスレッド マップと、より複雑なスキームの基礎があります。
これは並列 python に似ていますが、ローカル マシンに限定されており、python 2.6 以降に含まれており、比喩的には python のスレッド化に似ています。
これを行う。
タスクをステップまたはステージに分割します。各ステップは何かを読み取り、全体的な計算の一部を実行し、何かを書き込みます。
"""Some Step."""
import json
for some_line in sys.stdin:
object= json.loads( some_line )
# process the object
json.dump( result, sys.stdout )
そのようなことはうまくいくはずです。
通信する必要のあるオブジェクトが複数ある場合は、オブジェクトの簡単な辞書を作成します。
results = { 'a': a, 'b': b }
このようにパイプラインで接続します。
python step1.py | python step2.py | python step3.py >output_file.dat
8 つ以上のステップに分割できる場合は、8 つ以上のコアを使用します。そして、ところで、これは実際の作業がほとんどないため、非常に高速です。
タスクが並列化可能であると仮定すると、はい、スレッド化は確かに解決策です。特に、処理するデータ項目が多く、それらをすべて独立して処理できる場合、並列化は比較的簡単です。
複数のスレッドの代わりに複数のプロセスを使用することは、別の解決策かもしれません。あなたは、本当に言うべき問題について十分に話していません。