首页  >  文章  >  后端开发  >  如何在Python中实现Subprocess.call的非阻塞执行?

如何在Python中实现Subprocess.call的非阻塞执行?

Barbara Streisand
Barbara Streisand原创
2024-10-19 13:53:02777浏览

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 或更高版本),您可以利用“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