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

DDD
Libérer: 2024-10-25 16:36:15
original
204 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!