首頁 >後端開發 >Python教學 >如何在不使用 Python 中的多處理或執行緒的情況下並行運行多個子進程並收集它們的輸出?

如何在不使用 Python 中的多處理或執行緒的情況下並行運行多個子進程並收集它們的輸出?

Susan Sarandon
Susan Sarandon原創
2024-10-26 21:51:031086瀏覽

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