关于 Python 中 async, await 关键字的一些知识在去年的一篇 探索 Flask 对 asyncio 的支持 有讲到,一直没在实际上用过它们,所以基本上也就忘干净了。随着 Flask 2 加入了 async 的特性,以及 FastAPI 从一开始支持 async, 又觉得有必要重新温习一下 Python 中如何使用 async, await 关键字了。
注:由于 Flask 支持了 async, 号称 async 化 Flask 的 Quart 项目开始变得无足轻重了。
本文主要的学习材料是在 YouTube 上的一个视频 Fear and Awaiting in Async (Screencast) , 其中用 Python REPL 以 Live 的形式展示,对 async, await 关键字循序渐进的讲解。
如今不少语言都支持 async, await 关键字,如 C#, JavaScript, Kotlin, Rust 等,还有今天的主角 Python。而 Java 仍然很重视函数返回值的意义,未支持 async, 只能显式的返回 Future/CompletableFuture, 而且自己控制如何在线程池中执行。
这又来到了一个叫做纤程的概念,它隐藏在 Python 的 async, await 背后,Go 语言对纤程的支持就更简单了, go foo()
就是了。
async 关键字的函数
>>> def greeting(name): ... return 'Hello ' + name ... >>> greeting('Blog') Hello Blog
>>> def greeting ( name ) : . . . return 'Hello ' + name . . . >>> greeting ( 'Blog' ) Hello Blog |
调用后,函数立即执行
对于一个普通的没有 async 关键字的函数,调用它直接得到它的返回值,如果给它加上 async
关键字会怎么样呢?
>>> async def greeting(name): ... print('called gretting function') ... return 'Hello ' + name ... >>> greeting('Blog') <coroutine object greeting at 0x10dc8ece0>
>>> async def greeting ( name ) : . . . print ( 'called gretting function' ) . . . return 'Hello ' + name . . . >>> greeting ( 'Blog' ) < coroutine object greeting at 0x10dc8ece0 > | <