Maison >développement back-end >Tutoriel Python >Comment puis-je exécuter des sous-processus Bash en parallèle avec 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!