Maison  >  Article  >  développement back-end  >  Comment puis-je exécuter des sous-processus Bash en parallèle avec Python ?

Comment puis-je exécuter des sous-processus Bash en parallèle avec Python ?

DDD
DDDoriginal
2024-10-27 03:00:03382parcourir

How Can I Execute Bash Subprocesses in Parallel with Python?

Traitement parallèle avec les sous-processus Bash en Python

L'exécution de sous-processus bash en parallèle est une tâche courante dans les scripts et l'automatisation. En Python, vous pouvez utiliser le module subprocess pour générer de nouveaux processus et le module threading pour les exécuter simultanément.

Cependant, la technique décrite dans la première réponse à la question liée par l'utilisateur entraîne une exécution séquentielle de processus bash. Pour les exécuter en parallèle, utilisez les approches suivantes :

1. Utilisation de multiprocessing.dummy.Pool :

Pour une exécution parallèle avec un nombre limité de processus simultanés, vous pouvez utiliser multiprocessing.dummy.Pool. Il fournit une interface basée sur des threads similaire à multiprocessing.Pool.

<code class="python">import multiprocessing.dummy as mp
from subprocess import call

pool = mp.Pool(2)  # Set the maximum number of concurrent commands
for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
    if returncode != 0:
        print("%d command failed: %d" % (i, returncode))</code>

2. Utilisation de sous-processus avec contrôle manuel de la concurrence :

Vous pouvez limiter le nombre de processus simultanés sans utiliser de pools de threads ou de processus.

<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))
while running_processes:
    # Check for completed processes and start new ones
    for i, process in enumerate(running_processes):
        if process.poll() is not None:
            running_processes[i] = next(processes, None)
            if running_processes[i] is None:
                del running_processes[i]
                break</code>

3. Utilisation de sous-processus avec os.waitpid() (Unix uniquement) :

Sur les systèmes Unix, vous pouvez utiliser os.waitpid(-1, 0) pour bloquer et attendre la fin de tout processus enfant. Cela élimine le besoin d'une boucle chargée.

Ces méthodes offrent des options flexibles pour contrôler la concurrence dans les sous-processus bash à l'aide de Python.

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