与输出集合并行运行子进程
在给定的场景中,多个 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中文网其他相关文章!