Multithreading von Bash-Unterprozessen in Python
Threads sind für die Parallelisierung von Aufgaben unerlässlich, ihre Verwendung zusammen mit Unterprozessmodulen kann sich jedoch als schwierig erweisen. Wenn Bash-Prozesse über Threads ausgeführt werden, neigen sie dazu, nacheinander ausgeführt zu werden.
Parallele Ausführung ohne Threads
Die Verwendung von Threads ist nicht erforderlich, um Unterprozesse parallel auszuführen. Die Popen-Funktion des Unterprozessmoduls kann dies direkt verarbeiten:
<code class="python">from subprocess import Popen commands = ['bash commands here'] processes = [Popen(cmd, shell=True) for cmd in commands] # Perform other tasks while processes run in parallel for p in processes: p.wait()</code>
Gleichzeitige Unterprozesse begrenzen
Um die Anzahl gleichzeitiger Prozesse zu begrenzen, sollten Sie die Verwendung von multiprocessing.dummy.Pool in Betracht ziehen. was Multiprocessing.Pool imitiert, aber Threads nutzt:
<code class="python">from functools import partial from multiprocessing.dummy import Pool from subprocess import call commands = ['bash commands here'] pool = Pool(2) # Limit to 2 concurrent processes for _, returncode in enumerate(pool.imap(partial(call, shell=True), commands)): if returncode != 0: print(f"Command failed: {returncode}")</code>
Thread-basierte Alternativen
Andere Optionen zur Begrenzung gleichzeitiger Prozesse ohne Verwendung eines Prozesspools umfassen eine Thread-Warteschlangenkombination oder der folgende Ansatz:
<code class="python">from subprocess import Popen from itertools import islice commands = ['bash commands here'] running_processes = [] for cmd in islice(commands, 2): running_processes.append(Popen(cmd, shell=True)) while running_processes: for i, process in enumerate(running_processes): if process.poll() is not None: running_processes[i] = next(islice(commands, 1), None)</code>
Unix-spezifische Lösung
Für Unix-basierte Systeme sollten Sie die Verwendung von os.waitpid() in Verbindung mit dem oben genannten Ansatz in Betracht ziehen Vermeiden Sie Besetztschleifen. Ich hoffe, dass dies die verschiedenen verfügbaren Optionen für Multithreading-Bash-Unterprozesse in Python abdeckt und das aufgetretene Problem der sequentiellen Ausführung angeht. Wenn Sie weitere Fragen haben, können Sie sich gerne an uns wenden!
Das obige ist der detaillierte Inhalt vonWie erreicht man die parallele Ausführung von Bash-Unterprozessen in Python: Threads vs. andere Optionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!