Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich mehrere Unterprozesse parallel ausführen und ihre Ausgabe sammeln, ohne Multiprocessing oder Threading in Python zu verwenden?
Unterprozesse parallel zur Ausgabesammlung ausführen
Im gegebenen Szenario werden mehrere cat | Zgrep-Befehle werden nacheinander auf einem Remote-Server ausgeführt. Um diese Befehle gleichzeitig auszuführen und gleichzeitig einzelne Ausgaben zu sammeln, müssen wir die Verwendung von Multiprocessing oder Threading vermeiden.
Eine einfache Lösung besteht darin, die Popen-Funktion aus dem Unterprozessmodul zu verwenden. Indem wir für jeden Befehl individuelle Popen-Objekte erstellen und ihnen ein Shell-Argument übergeben, können wir sie parallel ausführen. Sobald die Befehle abgeschlossen sind, können wir ihre Exit-Codes mithilfe der Wait-Methode sammeln. Hier ist ein Beispiel:
<code class="python">from subprocess import Popen # Create a list of commands commands = ['echo {i:d}; sleep 2; echo {i:d}' for i in range(5)] # Run commands in parallel processes = [Popen(command, shell=True) for command in commands] # Collect statuses exitcodes = [p.wait() for p in processes]</code>
Dieser Code führt die fünf Befehle gleichzeitig aus und sammelt ihre Exit-Codes, sobald sie abgeschlossen sind.
Um die Ausgabe der Befehle zu sammeln, können wir Threads oder verwenden die Kommunikationsmethode in einem separaten Prozess. Beispiel: Verwendung eines Thread-Pools:
<code class="python">from multiprocessing.dummy import Pool # thread pool from subprocess import Popen # Run commands in parallel processes = [Popen(command, shell=True, close_fds=True) for command in commands] # Collect output in parallel def get_output(process): return process.communicate()[0] outputs = Pool(len(processes)).map(get_output, processes)</code>
Dieser Code führt alle Befehle gleichzeitig in einem Thread-Pool aus und sammelt ihre Ausgabe in einer Liste, in der jedes Element der Ausgabe eines einzelnen Befehls entspricht.
Eine weitere Alternative besteht darin, das Asyncio-Modul für die Ausgabesammlung im selben Thread zu verwenden (Python 3.8 und höher):
<code class="python">import asyncio from subprocess import PIPE async def get_output(command): process = await asyncio.create_subprocess_shell(command, stdout=PIPE) return (await process.communicate()[0]).decode() # Get commands output in parallel coros = [get_output(command) for command in commands] outputs = await asyncio.gather(*coros)</code>
Dieser Code erstellt Coroutinen, die die Befehle gleichzeitig ausführen und ihre Ausgaben als Liste zurückgeben.
Das obige ist der detaillierte Inhalt vonWie kann ich mehrere Unterprozesse parallel ausführen und ihre Ausgabe sammeln, ohne Multiprocessing oder Threading in Python zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!