Wie kann ich mehrere Unterprozesse parallel ausführen und ihre Ausgabe sammeln, ohne Multiprocessing oder Threading in Python zu verwenden?

Susan Sarandon
Freigeben: 2024-10-26 21:51:03
Original
983 Leute haben es durchsucht

How can I run multiple subprocesses in parallel and collect their output without using multiprocessing or threading in Python?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!