與輸出集合並行運行子進程
在給定的場景中,多個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中文網其他相關文章!