Parallele Bash-Subprozesse mit Python: Ein umfassender Leitfaden
Die effektive Nutzung der Python-Threading- und Subprozessmodule kann Ihnen dabei helfen, mehrere Bash-Prozesse gleichzeitig auszuführen. Durch einfaches Erstellen von Threads mit Threading wird jedoch möglicherweise nicht die gewünschte Parallelität erreicht.
Gleichzeitiges Prozessmanagement ohne Threads
Ein einfacher Ansatz zum gleichzeitigen Ausführen von Bash-Prozessen besteht darin, die Verwendung von Threads zu vermeiden insgesamt. Mit dem Dienstprogramm subprocess.Popen können Sie mehrere Befehle direkt parallel aufrufen, wie unten gezeigt:
<code class="python">from subprocess import Popen commands = [ 'date; ls -l; sleep 1; date', 'date; sleep 5; date', 'date; df -h; sleep 3; date', 'date; hostname; sleep 2; date', 'date; uname -a; date', ] # Execute commands concurrently processes = [Popen(cmd, shell=True) for cmd in commands]</code>
Kontrolle der Parallelität mit Multiprocessing
Wenn Sie eine Einschränkung benötigen Um die Anzahl der gleichzeitigen Prozesse zu erhöhen, können Sie multiprocessing.dummy.Pool verwenden, das eine threadbasierte Schnittstelle ähnlich multiprocessing.Pool bereitstellt. Der folgende Code veranschaulicht diesen Ansatz:
<code class="python">from functools import partial from multiprocessing.dummy import Pool from subprocess import call pool = Pool(2) # Limit to 2 concurrent processes for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)): if returncode != 0: print("%d command failed: %d" % (i, returncode))</code>
Nicht blockierende untergeordnete Prozessverwaltung
Alternativ können Sie gleichzeitig ablaufende untergeordnete Prozesse einschränken, ohne auf Thread- oder Prozesspools zurückgreifen zu müssen. Der folgende Code veranschaulicht diese Strategie:
<code class="python">from subprocess import Popen from itertools import islice max_workers = 2 # Maximum number of concurrent processes processes = (Popen(cmd, shell=True) for cmd in commands) running_processes = list(islice(processes, max_workers)) # Start initial processes while running_processes: for i, process in enumerate(running_processes): if process.poll() is not None: # Process has completed running_processes[i] = next(processes, None) # Start new process if running_processes[i] is None: # No new processes del running_processes[i] break</code>
Für Unix-Systeme sollten Sie die Verwendung von os.waitpid(-1, 0) in Betracht ziehen, um Auslastungsschleifen zu vermeiden und auf die Beendigung eines untergeordneten Prozesses zu warten.
Das obige ist der detaillierte Inhalt vonWie kann die Parallelität paralleler Bash-Unterprozesse in Python effektiv verwaltet und gesteuert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!