Wie kann die Parallelität paralleler Bash-Unterprozesse in Python effektiv verwaltet und gesteuert werden?

DDD
Freigeben: 2024-10-30 04:37:02
Original
456 Leute haben es durchsucht

How to effectively manage and control the concurrency of parallel bash subprocesses in Python?

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage