首頁  >  文章  >  後端開發  >  如何在Python中執行非阻塞子進程?

如何在Python中執行非阻塞子進程?

Susan Sarandon
Susan Sarandon原創
2024-10-19 13:45:29485瀏覽

How to Execute Non-Blocking Subprocesses in Python?

非阻塞子程序呼叫

使用 subprocess.call 執行外部腳本時,維護非阻塞工作流程對於避免主程式停頓至關重要。本文提出了實現此目標的全面解決方案。

使用 subprocess.Popen 的方法

執行非阻塞子程序的主要方法是使用 subprocess.Popen 而不是 subprocess.call。這種替代方案不會阻止主程序,允許它在子進程獨立運行時繼續其操作。這是一個範例:

<code class="python">subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>

綜合範例

有關非阻塞子程序呼叫的完整演示,請考慮以下程式碼:

<code class="python">import subprocess
import time

p = subprocess.Popen(['sleep', '5'])

while p.poll() is None:
    print('Still sleeping')
    time.sleep(1)

print('Not sleeping any longer.  Exited with returncode %d' % p.returncode)</code>

此程式碼執行非同步執行“sleep”命令,定期檢查其狀態直至完成。

替代非同步方法

對於 Python 版本 3.5 及更高版本,更現代、更有效率的方法涉及使用 asyncio。它允許真正的並發,使多個任務能夠同時執行。這是一個範例:

<code class="python">import asyncio

async def do_subprocess():
    print('Subprocess sleeping')
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    returncode = await proc.wait()
    print('Subprocess done sleeping.  Return code = %d' % returncode)

async def sleep_report(number):
    for i in range(number + 1):
        print('Slept for %d seconds' % i)
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

tasks = [
    asyncio.ensure_future(do_subprocess()),
    asyncio.ensure_future(sleep_report(5)),
]

loop.run_until_complete(asyncio.gather(*tasks))
loop.close()</code>

這種方法可確保子進程和主程式同時運行,從而最大限度地提高效能和回應能力。

以上是如何在Python中執行非阻塞子進程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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