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 ?

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
Susan Sarandonoriginal
2024-10-26 21:51:031085parcourir

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>

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!

Déclaration:
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