Comment puis-je exécuter plusieurs sous-processus en parallèle et collecter leur sortie sans utiliser le multitraitement ou le threading en Python ?

Susan Sarandon
Libérer: 2024-10-26 21:51:03
original
1077 Les gens l'ont consulté

How can I run multiple subprocesses in parallel and collect their output without using multiprocessing or threading in 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>
Copier après la connexion

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal