ホームページ  >  記事  >  バックエンド開発  >  \'cat | の並列実行を実現する方法zgrep\' コマンドは Python でサブプロセスを使用しますか?

\'cat | の並列実行を実現する方法zgrep\' コマンドは Python でサブプロセスを使用しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 05:21:30432ブラウズ

How to achieve parallel execution of 'cat | zgrep' commands using subprocesses in Python?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。