2016-07-23 1 views
0

私はPython 2.7を使用しています。私は、スレッドがsubprocessモジュールを使ってコマンドを起動するマルチスレッドプログラムを持っています。プロセスはシステム上で実行され、時々スレッドにデータを報告します。プロセスの大部分はプロセスで実行されます。スレッドは、プロセスから情報を取り出し、ファイルに書き込むだけです。Pythonでスレッドと組み合わせてサブプロセスを使用する効率

私は、Pythonでのマルチスレッドの使用には制限があることを理解します。しかし、この場合は、システムによって実行されるすべての重労働が予想されます(Linux)。これは、起動されるサブプロセスがCPUを集中的に処理するためです。したがって、スレッドは負荷を持ち運ぶ必要がないため、ボトルネックになってはいけません。

私はスレッドとサブプロセスをPythonで正確に使うことを理解していますか?これらの異なるサブプロセスは異なるコア上で動作することができるというのが私の理解の基本的な部分だと思うので、スレッドが1つのコアにバインドされていても、プロセスは効率的に実行され、

+0

はい、あなたは正しいです。 PythonのGILでは、一度に1つのスレッドしか実行できませんが、そのルールはPythonプロセスにのみ適用されます。すべてのサブプロセスは独立して実行されます。 Pythonスレッドはほとんどの場合、サブプロセスからのデータを待っているだけなので、互いに干渉しません。 – tdelaney

答えて

0

なぜ、サブプロセスはデータ処理自体を処理しないのですか?プロセスに物を戻すには、余分なものがあります。context switchesと、シリアル化とデシリアライゼーションのオーバーヘッドが必要です。これは、メインプロセスに戻す作業が多い場合に重要になります。このペナルティを支払うのではなく、サブプロセスでスレッドを使用する方が簡単かもしれません。

ただし、重要な点があります。 I/Oバウンドコード(ファイルの書き込み、ソケット上のデータの送受信など)はグローバルインタープリタロックのボトルネックにはなりませんが、CPUにバインドされたタスクは実行されます。スレッドの問題の詳細については、Jesse Noller's blog post on threadsおよびthe Python Wiki's article on the GILを参照してください。

+0

サブプロセスが独自のstdout/stderrパイプからのデータを処理するための不適切な選択肢になる理由はたくさんあります。おそらく主なプログラムはロギングであり、その情報を1つのファイルにインタリーブしたい、あるいは独自の処理ニーズのために集計データを取っているとします。これらが変更できない第三者プロセスであるとします。複数のプロセスによるデータのパイプライン化は、古くからのLinux/UNIXの伝統です。 – tdelaney

+0

@tdelaney彼は自分のアプリケーションで 'サブプロセス 'を使っていたと言いました。はい、パイプライン経由でデータを渡すことは、伝統的なUNIXの伝統ですが、処理を行うには常に効率的な方法ではありません。 – Elizafox

関連する問題