Maison  >  Article  >  développement back-end  >  Comment réaliser l'exécution parallèle de sous-processus Bash en Python : threads et autres options ?

Comment réaliser l'exécution parallèle de sous-processus Bash en Python : threads et autres options ?

DDD
DDDoriginal
2024-10-25 16:36:15196parcourir

How to Achieve Parallel Execution of Bash Subprocesses in Python: Threads vs. Other Options?

Sous-processus Bash multithreading en Python

Les threads sont essentiels pour paralléliser les tâches, mais leur utilisation avec des modules de sous-processus peut s'avérer délicate. Lors de l'exécution de processus bash via des threads, ils ont tendance à s'exécuter de manière séquentielle.

Exécution parallèle sans threads

L'utilisation de threads n'est pas nécessaire pour exécuter des sous-processus en parallèle. La fonction Popen du module de sous-processus peut gérer cela directement :

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

commands = ['bash commands here']
processes = [Popen(cmd, shell=True) for cmd in commands]

# Perform other tasks while processes run in parallel
for p in processes:
    p.wait()</code>

Limitation des sous-processus simultanés

Pour limiter le nombre de processus simultanés, pensez à utiliser multiprocessing.dummy.Pool, qui imite le multiprocessing.Pool mais exploite les threads :

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

commands = ['bash commands here']
pool = Pool(2) # Limit to 2 concurrent processes
for _, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
    if returncode != 0:
        print(f"Command failed: {returncode}")</code>

Alternatives basées sur les threads

D'autres options permettant de limiter les processus simultanés sans utiliser de pool de processus incluent une combinaison de file d'attente de threads ou l'approche suivante :

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

commands = ['bash commands here']
running_processes = []

for cmd in islice(commands, 2):
    running_processes.append(Popen(cmd, shell=True))

while running_processes:
    for i, process in enumerate(running_processes):
        if process.poll() is not None:
            running_processes[i] = next(islice(commands, 1), None)</code>

Solution spécifique à Unix

Pour les systèmes basés sur Unix, envisagez d'utiliser os.waitpid() en conjonction avec l'approche ci-dessus pour évitez les boucles chargées. J'espère que cela couvre les différentes options disponibles pour les sous-processus bash multithreading en Python et résout le problème d'exécution séquentielle rencontré. Si vous avez d'autres questions, n'hésitez pas à nous contacter !

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