Maison  >  Article  >  développement back-end  >  Comment réaliser une exécution parallèle de \'cat | Les commandes zgrep\' utilisant des sous-processus en Python ?

Comment réaliser une exécution parallèle de \'cat | Les commandes zgrep\' utilisant des sous-processus en Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-03 05:21:30477parcourir

How to achieve parallel execution of 'cat | zgrep' commands using subprocesses in Python?

Exécution parallèle de sous-processus 'cat' en Python

L'extrait de code ci-dessous démontre l'exécution séquentielle de plusieurs 'cat | zgrep' sur un serveur distant, collectant leur sortie individuellement.

<code class="python">import multiprocessing as mp

class MainProcessor(mp.Process):
    def __init__(self, peaks_array):
        super(MainProcessor, self).__init__()
        self.peaks_array = peaks_array

    def run(self):
        for peak_arr in self.peaks_array:
            peak_processor = PeakProcessor(peak_arr)
            peak_processor.start()

class PeakProcessor(mp.Process):
    def __init__(self, peak_arr):
        super(PeakProcessor, self).__init__()
        self.peak_arr = peak_arr

    def run(self):
        command = 'ssh remote_host cat files_to_process | zgrep --mmap "regex" '
        log_lines = (subprocess.check_output(command, shell=True)).split('\n')
        process_data(log_lines)</code>

Cependant, cette approche aboutit à une exécution séquentielle des commandes 'ssh ... cat ...'. Ce problème peut être résolu en modifiant le code pour exécuter les sous-processus en parallèle tout en collectant leur sortie individuellement.

Solution

Pour réaliser une exécution parallèle des sous-processus en Python, vous pouvez utiliser la classe 'Popen' du module 'subprocess'. Voici le code modifié :

<code class="python">from subprocess import Popen
import multiprocessing as mp

class MainProcessor(mp.Process):
    def __init__(self, peaks_array):
        super(MainProcessor, self).__init__()
        self.peaks_array = peaks_array

    def run(self):
        processes = []
        for peak_arr in self.peaks_array:
            command = 'ssh remote_host cat files_to_process | zgrep --mmap "regex" '
            process = Popen(command, shell=True, stdout=PIPE)
            processes.append(process)

        for process in processes:
            log_lines = process.communicate()[0].split('\n')
            process_data(log_lines)</code>

Ce code crée plusieurs processus 'Popen', chacun exécutant l'un des 'cat | zgrep' commandes. La méthode 'communicate()' est utilisée pour collecter le résultat de chaque processus, qui est ensuite transmis à la fonction 'process_data'.

Remarque : L'utilisation directe de la classe 'Popen' ne nécessite pas de mécanismes de threading ou de multitraitement explicites pour réaliser le parallélisme. Il gère la création et l'exécution de plusieurs sous-processus simultanément au sein du même 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