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 ?
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!