Python asyncio.subprocess():如何查看它是不是还在运行

Posted

技术标签:

【中文标题】Python asyncio.subprocess():如何查看它是不是还在运行【英文标题】:Python asyncio.subprocess(): How to see whether it is still runningPython asyncio.subprocess():如何查看它是否还在运行 【发布时间】:2021-01-24 18:54:53 【问题描述】:

对于由 asyncio.subprocess.Process 类创建的 p 对象

p = await asyncio.create_subprocess_exec(...)

如何以非阻塞方式确定系统调用是否仍在运行?

【问题讨论】:

【参考方案1】:

由于 asyncio Process 没有 poll() 方法,您可以结合 Process.wait()asyncio.wait_for(),使用一个微小的超时来允许 wait() 检查进程是否完成并设置 @987654327 @ 属性如果是这样。

async def is_running(proc):
    with contextlib.suppress(asyncio.TimeoutError):
        await asyncio.wait_for(proc.wait(), 1e-6)
    return proc.returncode is None

【讨论】:

那是天才!为什么 Process 不将其实现为成员函数? @Frank-ReneSchäfer 这是个好问题。 subprocess.Popen 有一个 poll() 方法,asyncio.subprocess.Process 明确提到缺少 poll()。遗漏显然是故意的,但没有提供任何理由。想到的唯一原因是作者认为上述实现“显而易见”并省略了poll(),原因与异步同步方法中省略了 timeout 参数相同。 我想,有些人应该和这些作者谈谈 :-) @Frank-ReneSchäfer bugs.python.org 上的一个问题可能是一个好的开始。还有一个mailing list。

以上是关于Python asyncio.subprocess():如何查看它是不是还在运行的主要内容,如果未能解决你的问题,请参考以下文章

我可以将长 bash 命令传递给 asyncio.subprocess.create_subprocess_exec() 吗?

连接两个以 asyncio.subprocess.create_subprocess_exec() 开始的进程

使用 asyncio.create_subprocess_exec 设置最大并发

任何人都可以将此 rsync 命令解析为与 asyncio.subprocess 一起使用的列表吗?

为啥在不同线程中调用 asyncio subprocess.communicate 会挂起?

从 async.subprocess.PIPE 读取