Comment pouvez-vous réaliser une exécution simultanée de \'cat | zgrep\' en Python tout en gérant efficacement les sorties individuelles pour un traitement ultérieur ?

Linda Hamilton
Libérer: 2024-10-27 07:04:03
original
376 Les gens l'ont consulté

How can you achieve concurrent execution of 'cat | zgrep' commands in Python while efficiently managing individual output for further processing?

Python : exécution simultanée de sous-processus « cat »

Dans les scénarios de traitement parallèle, l'exécution séquentielle peut constituer un goulot d'étranglement. Pour contourner ce problème, découvrez comment exécuter plusieurs 'cat | zgrep' simultanément en Python tout en conservant la sortie individuelle pour un traitement ultérieur.

Concurrence avec le module de sous-processus

Pour l'exécution simultanée de sous-processus sans recourir au multitraitement ou au threading, envisagez l'approche suivante :

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

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

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

Ce code lance cinq commandes shell en parallèle sans nécessiter d'appels '&' ou explicites '.wait()'.

Concurrence avec le pool de threads

Pour la collecte simultanée des sorties de sous-processus , des threads peuvent être utilisés :

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

# Create processes
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 output
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 rassemble la sortie du sous-processus en parallèle à l'aide d'un pool de threads.

Collection de sorties asynchrones (Python 3.8)

Dans Python 3.8, asyncio peut être utilisé pour la collecte simultanée de sorties dans un seul thread :

<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():
    # Concurrent command execution
    coros = [
        get_lines(
            f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"'
        )
        for i in range(5)
    ]
    print(await asyncio.gather(*coros))


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

Ce code exécute les sous-processus et collecte leur sortie de manière asynchrone, éliminant ainsi le besoin de multitraitement ou de thread.

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