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 ?
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.
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()'.
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.
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!