使用 asyncio 在 Python 中管道化两个子进程并中断它们

问题描述 投票:0回答:1

我的基于

asyncio
的 Python 代码使用
asyncio.create_subprocess_exec
启动了两个子进程。我希望一个将数据输出到标准输出,另一个在数据可用时通过管道读取它(在我的例子中,第一个进程输出视频帧,第二个进程对它们进行编码 - 它是
ffmpeg
)。 我发现创建
asyncio
可用的管道的唯一方法是在 this post 中。但是按照该方法,第二个进程 (
ffmpeg
) 崩溃并出现错误“文件描述符错误”。鉴于使用壳管时设置工作正常,我决定使用
asyncio.create_subprocess_shell
来为我处理管道。但是这两个进程都设计为永远运行直到中断,所以我需要一种方法来终止它们。在
.terminate()
返回的进程上调用
create_subprocess_shell
,或者用
SIGTERM
SIGINT
杀死它什么都不做。我怎样才能杀死这些进程?

python subprocess python-asyncio
1个回答
0
投票

.terminate()
不做任何事情的原因是 Bash 进程默认拦截信号并且不会将它们传播到正在运行的命令。解决方法是从进程对象中获取
pid
,并使用
psutil
获取该进程的所有子进程,并一个接一个地终止它们然后杀死shell本身。

© www.soinside.com 2019 - 2024. All rights reserved.