非阻塞 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>
附加说明
以上是如何在Python中实现Subprocess.call的非阻塞执行?的详细内容。更多信息请关注PHP中文网其他相关文章!