首页  >  文章  >  后端开发  >  如何执行多个\'cat | zgrep\' 在 Python 中同时执行命令?

如何执行多个\'cat | zgrep\' 在 Python 中同时执行命令?

DDD
DDD原创
2024-10-27 07:09:29234浏览

How to Execute Multiple 'cat | zgrep' Commands Concurrently in Python?

执行多个 'cat | zgrep'并发命令

在此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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn