【发布时间】:2020-07-18 10:58:27
【问题描述】:
我是 Python 异步概念的新手。但是我想顺序调用 2 个函数,这里的顺序很重要:
def func1():
p = subprocess.Popen('ffmpeg -i in.webm out.mp4')
p.wait()
def func2():
os.remove('in.webm')
func1()
func2()
函数 1 包含转换视频文件的子进程,函数 2 之后删除输入。Popen 和 p.wait() 确实强制同步执行,但其代价是阻塞主线程。
@没有p.wait() 的 987654324@ 不会阻止它,但会在 ffmpeg 完成其工作之前调用函数 2。
我想实现类似于 Javascript 承诺或 async/await 结构的东西,如下所示:
async func1() {
let response = await fetch('/api');
let user = await response.json();
return user;
}
func2(func1());
听起来像是一项微不足道的任务,但我在多线程、多处理和异步之间迷失了。
如何让函数 2 在不阻塞主线程的情况下等待函数 1 的输出?
【问题讨论】:
-
如果
ffmpeg使用ffmpeg -i in.webm out.mp4 && rm in.webm成功运行,你可以让shell 为你做这件事 -
@MarkSetchell 我想了解一下这个概念,ffmpeg 纯粹是为了演示目的
-
在您的 JS 示例中,
func2收到一个承诺,如果它想获得“用户”,它必须等待。您也没有指定func2是同步还是异步。您能否充实 JS 示例,否则(对我而言)您想要实现的目标并不明显。 -
@user4815162342 问题是如何让函数 2 在不阻塞主线程的情况下等待函数 1 的输出?想想这个:fetch('api').then(res => console.log(res.json()))。如何在 Python 中实现相同的功能?
-
主线程将始终被阻塞,因为它可能正在运行 asyncio 事件循环。但是 事件循环 不会被阻塞,因为它可以运行其他任务。就像 JavaScrpit 一样,asyncio 是单线程的。
标签: python subprocess python-asyncio python-multithreading popen