Maison >développement back-end >Tutoriel Python >Comment puis-je exécuter plusieurs sous-processus en parallèle et collecter leur sortie sans utiliser le multitraitement ou le threading en Python ?
Exécution de sous-processus en parallèle avec la collection de sorties
Dans le scénario donné, plusieurs cat | Les commandes zgrep sont exécutées séquentiellement sur un serveur distant. Pour exécuter ces commandes simultanément tout en collectant des sorties individuelles, nous devons éviter d'utiliser le multitraitement ou le threading.
Une solution simple consiste à utiliser la fonction Popen du module de sous-processus. En créant des objets Popen individuels pour chaque commande et en leur passant un argument shell, nous pouvons les exécuter en parallèle. Une fois les commandes terminées, nous pouvons collecter leurs codes de sortie en utilisant la méthode d'attente. Voici un exemple :
<code class="python">from subprocess import Popen # Create a list of commands commands = ['echo {i:d}; sleep 2; echo {i:d}' for i in range(5)] # Run commands in parallel processes = [Popen(command, shell=True) for command in commands] # Collect statuses exitcodes = [p.wait() for p in processes]</code>
Ce code exécute les cinq commandes simultanément et collecte leurs codes de sortie une fois qu'elles sont terminées.
Pour collecter le résultat des commandes, nous pouvons utiliser des threads ou la méthode de communication dans un processus distinct. Par exemple, en utilisant un pool de threads :
<code class="python">from multiprocessing.dummy import Pool # thread pool from subprocess import Popen # Run commands in parallel processes = [Popen(command, shell=True, close_fds=True) for command in commands] # Collect output in parallel def get_output(process): return process.communicate()[0] outputs = Pool(len(processes)).map(get_output, processes)</code>
Ce code exécute toutes les commandes simultanément dans un pool de threads et rassemble leur sortie dans une liste, où chaque élément correspond à la sortie d'une commande individuelle.
Une autre alternative consiste à utiliser le module asyncio pour la collecte des sorties dans le même thread (Python 3.8 et supérieur) :
<code class="python">import asyncio from subprocess import PIPE async def get_output(command): process = await asyncio.create_subprocess_shell(command, stdout=PIPE) return (await process.communicate()[0]).decode() # Get commands output in parallel coros = [get_output(command) for command in commands] outputs = await asyncio.gather(*coros)</code>
Ce code crée des coroutines qui exécutent les commandes simultanément et renvoie leurs sorties sous forme de liste.
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!