如何實現\'cat | 的並行執行zgrep\' 在 Python 中使用子程序的指令?

Mary-Kate Olsen
發布: 2024-11-03 05:21:30
原創
477 人瀏覽過

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

Python 中「cat」子程序的平行執行

下面的程式碼片段示範了多個「cat |」的順序執行zgrep ' 命令在遠端伺服器上,單獨收集它們的輸出。

<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 |」之一。 zgrep' 命令。 'communicate()' 方法用於收集每個進程的輸出,然後將其傳遞給 'process_data' 函數。

注意: 直接使用 'Popen' 類別不會不需要明確的執行緒或多處理機制來實現並行性。它在同一線程內同時處理多個子進程的建立和執行。

以上是如何實現\'cat | 的並行執行zgrep\' 在 Python 中使用子程序的指令?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板