Maison  >  Article  >  développement back-end  >  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 ?

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
Linda Hamiltonoriginal
2024-10-27 07:04:03372parcourir

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>

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>

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>

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!

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