首頁  >  文章  >  後端開發  >  如何在Python中有效管理與控制並行bash子程序的同時?

如何在Python中有效管理與控制並行bash子程序的同時?

DDD
DDD原創
2024-10-30 04:37:02381瀏覽

How to effectively manage and control the concurrency of parallel bash subprocesses in Python?

使用Python 並行Bash 子進程:綜合指南

有效地利用Python 執行緒和子進程模組可以幫助您同時執行多個bash 進程。然而,簡單地使用執行緒創建執行緒可能無法實現所需的並行性。

沒有執行緒的並發進程管理

並發執行 bash 進程的一個直接方法是避免使用執行緒共。使用subprocess.Popen 實用程序,您可以直接並行調用多個命令,如下所示:

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

commands = [
    'date; ls -l; sleep 1; date',
    'date; sleep 5; date',
    'date; df -h; sleep 3; date',
    'date; hostname; sleep 2; date',
    'date; uname -a; date',
]
# Execute commands concurrently
processes = [Popen(cmd, shell=True) for cmd in commands]</code>

透過多處理控制並發

如果需要限制並發進程的數量,您可以使用multiprocessing.dummy.Pool,它提供了類似於multiprocessing.Pool 的基於線程的介面。以下程式碼說明了這種方法:

<code class="python">from functools import partial
from multiprocessing.dummy import Pool
from subprocess import call

pool = Pool(2) # Limit to 2 concurrent processes
for i, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
    if returncode != 0:
       print("%d command failed: %d" % (i, returncode))</code>

非阻塞子進程管理

或者,您可以限制並發子進程,而無需求助於執行緒或進程池。下面的程式碼示範了這個策略:

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

max_workers = 2  # Maximum number of concurrent processes
processes = (Popen(cmd, shell=True) for cmd in commands)
running_processes = list(islice(processes, max_workers))  # Start initial processes

while running_processes:
    for i, process in enumerate(running_processes):
        if process.poll() is not None:  # Process has completed
            running_processes[i] = next(processes, None)  # Start new process
            if running_processes[i] is None: # No new processes
                del running_processes[i]
                break</code>

對於 Unix 系統,請考慮使用 os.waitpid(-1, 0) 來避免繁忙循環並等待任何子程序終止。

以上是如何在Python中有效管理與控制並行bash子程序的同時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn