首页  >  文章  >  后端开发  >  如何在不使用 Python 中的多处理或线程的情况下并行运行多个子进程并收集它们的输出?

如何在不使用 Python 中的多处理或线程的情况下并行运行多个子进程并收集它们的输出?

Susan Sarandon
Susan Sarandon原创
2024-10-26 21:51:03984浏览

How can I run multiple subprocesses in parallel and collect their output without using multiprocessing or threading in Python?

与输出集合并行运行子进程

在给定的场景中,多个 cat | zgrep 命令正在远程服务器上按顺序执行。要在收集各个输出的同时同时运行这些命令,我​​们需要避免使用多处理或线程。

一个简单的解决方案是使用 subprocess 模块中的 Popen 函数。通过为每个命令创建单独的 Popen 对象并向它们传递 shell 参数,我们可以并行运行它们。命令完成后,我们可以使用 wait 方法收集它们的退出代码。下面是一个示例:

<code class="python">from subprocess import Popen

# Create a list of commands
commands = ['echo {i:d}; sleep 2; echo {i:d}' for i in range(5)]

# Run commands in parallel
processes = [Popen(command, shell=True) for command in commands]

# Collect statuses
exitcodes = [p.wait() for p in processes]</code>

此代码同时运行五个命令,并在完成后收集它们的退出代码。

要收集命令的输出,我们可以使用线程或单独进程中的通信方法。例如,使用线程池:

<code class="python">from multiprocessing.dummy import Pool # thread pool
from subprocess import Popen

# Run commands in parallel
processes = [Popen(command, shell=True, close_fds=True) for command in commands]

# Collect output in parallel
def get_output(process):
    return process.communicate()[0]

outputs = Pool(len(processes)).map(get_output, processes)</code>

此代码在线程池中同时运行所有命令,并将其输出收集到一个列表中,其中每个元素对应于单个命令的输出。

另一种选择是在同一线程中使用 asyncio 模块进行输出收集(Python 3.8 及更高版本):

<code class="python">import asyncio
from subprocess import PIPE

async def get_output(command):
    process = await asyncio.create_subprocess_shell(command, stdout=PIPE)
    return (await process.communicate()[0]).decode()

# Get commands output in parallel
coros = [get_output(command) for command in commands]
outputs = await asyncio.gather(*coros)</code>

此代码创建同时执行命令的协程并将其输出作为列表返回。

以上是如何在不使用 Python 中的多处理或线程的情况下并行运行多个子进程并收集它们的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

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