在此 Python 脚本中,多个 'cat | zgrep' 命令在远程服务器上按顺序执行,并单独收集它们的输出以进行处理。然而,为了提高效率,我们的目标是并行执行这些命令。
与使用多处理或线程相反,您可以使用以下方法并行执行子进程:
#!/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]
此代码同时启动五个 shell 命令并收集它们的退出代码。请注意,在此上下文中不需要 & 字符,因为 Popen 默认情况下不等待命令完成。您必须显式调用 .wait() 来检索其状态。
虽然顺序收集子进程的输出很方便,但如果需要,您也可以使用线程进行并行收集。考虑以下示例:
#!/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)
此代码并行运行子进程并使用线程同时收集其输出。
对于 Python 3.8 及更高版本,asyncio 提供了一种并发执行子进程的优雅方式。这是一个例子:
#!/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())
此代码演示了如何在单个线程中同时运行子进程。
通过实现这些方法,您可以通过执行多个子进程来显着提高脚本的效率'猫| zgrep' 在远程服务器上并行命令。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3