Python 中“cat”子进程的并行执行
下面的代码片段演示了多个“cat |”的顺序执行zgrep' 命令在远程服务器上,单独收集它们的输出。
<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>
但是,这种方法会导致“ssh ... cat ...”命令的顺序执行。这个问题可以通过修改代码来并行运行子进程,同时仍然单独收集它们的输出来解决。
解决方案
要在Python中实现子进程的并行执行,您可以使用“subprocess”模块中的“Popen”类。这是修改后的代码:
<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>
此代码创建多个“Popen”进程,每个进程运行“cat |”之一。 zgrep' 命令。 'communicate()' 方法用于收集每个进程的输出,然后将其传递给 'process_data' 函数。
注意: 直接使用 'Popen' 类不会不需要显式的线程或多处理机制来实现并行性。它在同一线程内同时处理多个子进程的创建和执行。
以上是如何实现\'cat | 的并行执行zgrep\' 在 Python 中使用子进程的命令?的详细内容。更多信息请关注PHP中文网其他相关文章!