web-dev-qa-db-ja.com

Pythonでサブプロセス、マルチプロセッシング、スレッドを決定しますか?

Pythonプログラムを並列化して、実行するマシン上の複数のプロセッサーを使用できるようにします。並列化は非常に簡単です。プログラムは独立しており、出力を個別のファイルに書き込みます。情報を交換するためにスレッドは必要ありませんが、パイプラインの一部のステップが出力に依存するため、スレッドが終了するタイミングを知る必要があります。

移植性は重要です。これは、Mac、Linux、およびWindowsの任意のPythonバージョンで実行したい。これらの制約がある場合、最も適切なPythonこれを実装するためのモジュール?スレッド、サブプロセス、およびマルチプロセッシングを決定しようとしていますが、これらはすべて関連する機能を提供しているようです。

これについて何か考えはありますか?ポータブルで最もシンプルなソリューションが欲しい。

95
user248237

同様の場合、私は別のプロセスと、ネットワークソケットを介した必要な通信を少し選択しました。移植性が高く、Pythonを使用して行うのは非常に簡単ですが、おそらく単純ではありません(私の場合、別の制約もありました:C++で書かれた他のプロセスとの通信)。

あなたの場合、少なくともCPythonを使用している場合、pythonスレッドは実際のスレッドではないので、おそらくマルチプロセスに行きます。まあ、それらはネイティブシステムスレッドですが、Pythonから呼び出されたCモジュールはGILをリリースする場合としない場合があり、ブロッキングコードを呼び出すときに他のスレッドを実行できます。

5
kriss

CPythonで複数のプロセッサを使用するには、only選択肢は multiprocessing モジュールです。 CPythonは、その内部( [〜#〜] gil [〜#〜] )のロックを保持します。これにより、他のcpusのスレッドが並行して動作しなくなります。 multiprocessingモジュールは、新しいプロセス(subprocessなど)を作成し、それらの間の通信を管理します。

4
Jochen Ritzel

シェルを開き、Unixを使用してジョブを実行します。

iterpipes を使用してサブプロセスをラップしてから:

Ted Ziubaのサイトから

INPUTS_FROM_YOU | xargs -n1 -0 -P NUM ./process #NUM並列プロセス

OR

Gnu Parallel も提供します

あなたはマルチコアの仕事をするためにバックルームの少年たちを派遣している間、GILと一緒に出かけます。

1
chiggsy