首頁  >  文章  >  後端開發  >  如何在Python中實作Subprocess.call的非阻塞執行?

如何在Python中實作Subprocess.call的非阻塞執行?

Barbara Streisand
Barbara Streisand原創
2024-10-19 13:53:02781瀏覽

How to Achieve Non-Blocking Execution of Subprocess.call in Python?

非阻塞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>

附加說明

  • 當使用「shell」 ,」請記住避免使用清單來傳遞參數,因為這可能會導致安全漏洞。
  • 提供的 MCVE(最小完整可驗證範例)示範了使用“subprocess.Popen( )”和“asyncio”,在實際環境中展示這個概念。

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

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