非阻塞subprocess.call:實作並行腳本執行
在Python 程式中執行asubprocess.call() 時,呼叫者通常等待者子進程完成後再繼續。但是,對於某些應用程序,可能需要使子進程成為非阻塞,從而允許呼叫者在子進程並發運行時繼續執行。
問題場景
考慮以下場景:您希望從「main.py」程式啟動「slave.py」腳本作為非阻塞subprocess.call()。當後者第一次啟動時,您需要將參數從「main.py」傳遞給「slave.py」一次,但之後不需要在腳本之間進行進一步的通訊。
解決方案:subprocess.Popen
要實現「slave.py」的非阻塞執行,請將「main.py」中的「subprocess.call( )”替換為“subprocess.Popen()”,而不是等待子進程完成後,“subprocess.Popen()”立即返回,允許“main.py”繼續操作。
程式碼範例
<code class="python">import subprocess import sys subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
替代方案:asyncio
對於較新版本的Python(3.5 或更高(3.版本),您可以利用“asyncio”模組來實現非阻塞子進程調用,此方法利用協程的並發性來執行多個任務。
程式碼範例(asyncio)
<code class="python">import asyncio async def do_subprocess(): proc = await asyncio.create_subprocess_exec('sleep', '5') returncode = await proc.wait() print(f'Subprocess done sleeping. Return code = {returncode}') loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.gather(do_subprocess())) loop.close()</code>
附加說明
以上是如何在Python中實作Subprocess.call的非阻塞執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!