Python での 'cat' サブプロセスの並列実行
以下のコード スニペットは、複数の 'cat | サブプロセスの順次実行を示しています。
<code class="python">import multiprocessing as mp class MainProcessor(mp.Process): def __init__(self, peaks_array): super(MainProcessor, self).__init__() self.peaks_array = peaks_array def run(self): for peak_arr in self.peaks_array: peak_processor = PeakProcessor(peak_arr) peak_processor.start() class PeakProcessor(mp.Process): def __init__(self, peak_arr): super(PeakProcessor, self).__init__() self.peak_arr = peak_arr def run(self): command = 'ssh remote_host cat files_to_process | zgrep --mmap "regex" ' log_lines = (subprocess.check_output(command, shell=True)).split('\n') process_data(log_lines)</code>
ただし、このアプローチでは、「ssh ... cat ...」コマンドが順次実行されることになります。この問題は、出力を個別に収集しながらサブプロセスを並列実行するようにコードを変更することで解決できます。
解決策
Python でサブプロセスの並列実行を実現するには、次のようにします。 「subprocess」モジュールの「Popen」クラスを使用できます。変更されたコードは次のとおりです。
<code class="python">from subprocess import Popen import multiprocessing as mp class MainProcessor(mp.Process): def __init__(self, peaks_array): super(MainProcessor, self).__init__() self.peaks_array = peaks_array def run(self): processes = [] for peak_arr in self.peaks_array: command = 'ssh remote_host cat files_to_process | zgrep --mmap "regex" ' process = Popen(command, shell=True, stdout=PIPE) processes.append(process) for process in processes: log_lines = process.communicate()[0].split('\n') process_data(log_lines)</code>
このコードは複数の 'Popen' プロセスを作成し、それぞれが 'cat | 'cat | 'の 1 つを実行します。 zgrep」コマンド。 「communicate()」メソッドは各プロセスからの出力を収集するために使用され、出力は「process_data」関数に渡されます。
注: 「Popen」クラスを直接使用すると、並列処理を実現するために明示的なスレッド化やマルチプロセッシング メカニズムは必要ありません。同じスレッド内で複数のサブプロセスの作成と実行を同時に処理します。
以上が\'cat | の並列実行を実現する方法zgrep\' コマンドは Python でサブプロセスを使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。