Parallele Ausführung von „cat“-Unterprozessen in Python
Der folgende Codeausschnitt demonstriert die sequentielle Ausführung mehrerer „cat“-Unterprozesse zgrep‘-Befehle auf einem Remote-Server ausführen und deren Ausgabe einzeln sammeln.
<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>
Dieser Ansatz führt jedoch zu einer sequentiellen Ausführung der ‚ssh ... cat …‘-Befehle. Dieses Problem kann gelöst werden, indem der Code so geändert wird, dass die Unterprozesse parallel ausgeführt werden und ihre Ausgabe weiterhin einzeln erfasst wird.
Lösung
Um eine parallele Ausführung von Unterprozessen in Python zu erreichen, Sie können die Klasse „Popen“ aus dem Modul „subprocess“ verwenden. Hier ist der geänderte Code:
<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>
Dieser Code erstellt mehrere „Popen“-Prozesse, von denen jeder einen der „cat |“-Prozesse ausführt zgrep'-Befehle. Die Methode „communicate()“ wird verwendet, um die Ausgabe jedes Prozesses zu sammeln, die dann an die Funktion „process_data“ übergeben wird.
Hinweis: Die direkte Verwendung der Klasse „Popen“ funktioniert Es sind keine expliziten Threading- oder Multiprocessing-Mechanismen erforderlich, um Parallelität zu erreichen. Es übernimmt die Erstellung und Ausführung mehrerer Unterprozesse gleichzeitig innerhalb desselben Threads.
Das obige ist der detaillierte Inhalt vonSo erreichen Sie die parallele Ausführung von \'cat | zgrep-Befehle mit Unterprozessen in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!