在此Python脚本中,多个'cat | zgrep' 命令在远程服务器上按顺序执行,并单独收集它们的输出以进行处理。然而,为了提高效率,我们的目标是并行执行这些命令。
与使用多处理或线程相反,您可以使用以下方法并行执行子进程:
<code class="python">#!/usr/bin/env python from subprocess import Popen # create a list of subprocesses processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True) for i in range(5)] # collect statuses of subprocesses exitcodes = [p.wait() for p in processes]</code>
此代码同时启动五个 shell 命令并收集它们的退出代码。请注意,在此上下文中不需要 & 字符,因为 Popen 默认情况下不等待命令完成。您必须显式调用 .wait() 来检索其状态。
虽然顺序收集子进程的输出很方便,但如果需要,您也可以使用线程进行并行收集。考虑以下示例:
<code class="python">#!/usr/bin/env python from multiprocessing.dummy import Pool # thread pool from subprocess import Popen, PIPE, STDOUT # create a list of subprocesses with output handling 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 outputs in parallel def get_lines(process): return process.communicate()[0].splitlines() outputs = Pool(len(processes)).map(get_lines, processes)</code>
此代码并行运行子进程并使用线程同时收集其输出。
适用于 Python 版本 3.8 和如上所述,asyncio 提供了一种并发执行子进程的优雅方式。下面是一个示例:
<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(): # create a list of coroutines for subprocess execution coros = [get_lines(f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"') for i in range(5)] # get subprocess outputs in parallel print(await asyncio.gather(*coros)) if __name__ == "__main__": asyncio.run(main())</code>
此代码演示了如何在单个线程中同时运行子进程。
通过实现这些方法,您可以通过执行多个 ' 来显着提高脚本的效率。猫 | zgrep' 在远程服务器上并行执行命令。
以上是如何执行多个\'cat | zgrep\' 在 Python 中同时执行命令?的详细内容。更多信息请关注PHP中文网其他相关文章!