Heim  >  Artikel  >  Backend-Entwicklung  >  So erreichen Sie die parallele Ausführung von \'cat | zgrep-Befehle mit Unterprozessen in Python?

So erreichen Sie die parallele Ausführung von \'cat | zgrep-Befehle mit Unterprozessen in Python?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-03 05:21:30430Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn