Maison > développement back-end > Tutoriel Python > Comment puis-je exécuter plusieurs commandes Bash simultanément en Python ?

Comment puis-je exécuter plusieurs commandes Bash simultanément en Python ?

DDD
Libérer: 2024-10-26 04:01:27
original
395 Les gens l'ont consulté

How can I execute multiple Bash commands concurrently in Python?

Traitement parallèle des sous-processus Bash en Python

L'exécution séquentielle des sous-processus peut nuire aux performances de votre application. Pour exécuter plusieurs commandes bash simultanément, vous pouvez exploiter les modules de threading et de sous-processus en Python.

Utiliser directement les sous-processus

Bien que le threading puisse sembler nécessaire pour le traitement parallèle, ce n'est pas le cas. requis. Vous pouvez utiliser la fonction subprocess.Popen pour lancer des processus en parallèle :

<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',
]

# Run commands in parallel
processes = [Popen(cmd, shell=True) for cmd in commands]

# Perform other tasks while processes run

# Wait for completion
for p in processes:
    p.wait()</code>
Copier après la connexion

Limiter les sous-processus simultanés

Pour limiter le nombre de processus simultanés, pensez à utiliser le multitraitement Module .dummy.Pool, qui simule le multitraitement à l'aide de threads :

<code class="python">from functools import partial
from multiprocessing.dummy import Pool
from subprocess import call

pool = Pool(2)  # Limit to two concurrent commands

# Iterate over commands and return codes
for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
    if returncode != 0:
        print("%d command failed: %d" % (i, returncode))</code>
Copier après la connexion

Limitation sans pools

Vous pouvez également limiter la concurrence sans pools de threads :

<code class="python">from subprocess import Popen
from itertools import islice

max_workers = 2

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 finished
            running_processes[i] = next(processes, None)  # Start new process
            if running_processes[i] is None:  # No new processes
                del running_processes[i]
                break</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal