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中文網其他相關文章!