Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann die Parallelität paralleler Bash-Unterprozesse in Python effektiv verwaltet und gesteuert werden?

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

DDD
DDDOriginal
2024-10-30 04:37:02381Durchsuche

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>

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!

Stellungnahme:
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