Maison > développement back-end > Tutoriel Python > Comment exécuter plusieurs \'cat | Commandes zgrep\' simultanément en Python ?

Comment exécuter plusieurs \'cat | Commandes zgrep\' simultanément en Python ?

DDD
Libérer: 2024-10-27 07:09:29
original
390 Les gens l'ont consulté

How to Execute Multiple 'cat | zgrep' Commands Concurrently in Python?

Exécuter plusieurs 'cat | zgrep' Commandes simultanément

Dans ce script Python, plusieurs 'cat | Les commandes zgrep sont exécutées séquentiellement sur un serveur distant et leurs sorties sont collectées individuellement pour traitement. Cependant, pour améliorer l'efficacité, nous visons à exécuter ces commandes en parallèle.

Utiliser un sous-processus sans thread

Contrairement à l'utilisation du multitraitement ou du threading, vous pouvez exécuter des sous-processus en parallèle en utilisant l'approche suivante :

<code class="python">#!/usr/bin/env python
from subprocess import Popen

# create a list of subprocesses
processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True) for i in range(5)]

# collect statuses of subprocesses
exitcodes = [p.wait() for p in processes]</code>
Copier après la connexion

Ce code lance cinq commandes shell simultanément et récupère leurs codes de sortie. Notez que le caractère & n'est pas nécessaire dans ce contexte puisque Popen n'attend pas la fin des commandes par défaut. Vous devez explicitement appeler .wait() pour récupérer leurs statuts.

Sous-processus avec collection de sorties

Bien qu'il soit pratique de collecter les sorties des sous-processus de manière séquentielle, vous pouvez également utiliser des threads pour la collecte parallèle si vous le souhaitez. . Prenons l'exemple suivant :

<code class="python">#!/usr/bin/env python
from multiprocessing.dummy import Pool # thread pool
from subprocess import Popen, PIPE, STDOUT

# create a list of subprocesses with output handling
processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True,
                   stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
             for i in range(5)]

# collect outputs in parallel
def get_lines(process):
    return process.communicate()[0].splitlines()

outputs = Pool(len(processes)).map(get_lines, processes)</code>
Copier après la connexion

Ce code exécute des sous-processus en parallèle et collecte leurs sorties simultanément à l'aide de threads.

Exécution parallèle basée sur Asyncio

Pour les versions 3.8 et Python ci-dessus, asyncio offre un moyen élégant d'exécuter des sous-processus simultanément. Voici un exemple :

<code class="python">#!/usr/bin/env python3
import asyncio
import sys
from subprocess import PIPE, STDOUT

async def get_lines(shell_command):
    p = await asyncio.create_subprocess_shell(
        shell_command, stdin=PIPE, stdout=PIPE, stderr=STDOUT
    )
    return (await p.communicate())[0].splitlines()


async def main():
    # create a list of coroutines for subprocess execution
    coros = [get_lines(f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"') for i in range(5)]

    # get subprocess outputs in parallel
    print(await asyncio.gather(*coros))

if __name__ == "__main__":
    asyncio.run(main())</code>
Copier après la connexion

Ce code montre comment exécuter des sous-processus simultanément au sein d'un seul thread.

En mettant en œuvre ces approches, vous pouvez améliorer considérablement l'efficacité de votre script en exécutant plusieurs ' chat | zgrep' en parallèle sur le serveur distant.

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