使用 subprocess.call 執行外部腳本時,維護非阻塞工作流程對於避免主程式停頓至關重要。本文提出了實現此目標的綜合解決方案。
執行非阻塞子程序的主要方法是使用 subprocess.Popen 而不是 subprocess.call。這種替代方案不會阻止主程序,允許主程序在子進程獨立運行時繼續其操作。以下是一個範例:
subprocess.Popen(["python", "slave.py"] sys.argv[1:])
有關非阻塞子流程呼叫的完整演示,請考慮以下程式碼:
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)
此代碼非同步執行 'sleep' 命令,定期檢查其狀態直至完成。
對於 Python 3.5 及更高版本,更現代、更有效率的方法涉及使用 asyncio。它允許真正的並發,使多個任務能夠同時執行。這是一個例子:
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()
這種方法確保子程序和主程式同時運行,從而最大限度地提高效能和回應能力。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3