Pythonプログラムを並列化して、実行するマシン上の複数のプロセッサーを使用できるようにします。並列化は非常に簡単です。プログラムは独立しており、出力を個別のファイルに書き込みます。情報を交換するためにスレッドは必要ありませんが、パイプラインの一部のステップが出力に依存するため、スレッドが終了するタイミングを知る必要があります。
移植性は重要です。これは、Mac、Linux、およびWindowsの任意のPythonバージョンで実行したい。これらの制約がある場合、最も適切なPythonこれを実装するためのモジュール?スレッド、サブプロセス、およびマルチプロセッシングを決定しようとしていますが、これらはすべて関連する機能を提供しているようです。
これについて何か考えはありますか?ポータブルで最もシンプルなソリューションが欲しい。
同様の場合、私は別のプロセスと、ネットワークソケットを介した必要な通信を少し選択しました。移植性が高く、Pythonを使用して行うのは非常に簡単ですが、おそらく単純ではありません(私の場合、別の制約もありました:C++で書かれた他のプロセスとの通信)。
あなたの場合、少なくともCPythonを使用している場合、pythonスレッドは実際のスレッドではないので、おそらくマルチプロセスに行きます。まあ、それらはネイティブシステムスレッドですが、Pythonから呼び出されたCモジュールはGILをリリースする場合としない場合があり、ブロッキングコードを呼び出すときに他のスレッドを実行できます。
CPythonで複数のプロセッサを使用するには、only選択肢は multiprocessing
モジュールです。 CPythonは、その内部( [〜#〜] gil [〜#〜] )のロックを保持します。これにより、他のcpusのスレッドが並行して動作しなくなります。 multiprocessing
モジュールは、新しいプロセス(subprocess
など)を作成し、それらの間の通信を管理します。
シェルを開き、Unixを使用してジョブを実行します。
iterpipes を使用してサブプロセスをラップしてから:
INPUTS_FROM_YOU | xargs -n1 -0 -P NUM ./process #NUM並列プロセス
OR
Gnu Parallel も提供します
あなたはマルチコアの仕事をするためにバックルームの少年たちを派遣している間、GILと一緒に出かけます。