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!