异步编程

为了避免歧义,本书中的异步编程特指在 Rust 中使用 async/await 关键字进行编写异步代码。

通过 async 关键字创建的异步函数或者异步块会返回一个实现了 Future trait 的类型,其本质上是一个协程对象。将 async/await 关键字和异步运行时结合使用就可以实现对多个协程对象的调度执行,从而达到并发执行的效果。

在 Rust 中主要应用的是 进程—线程—协程 异步模型,如下所示:

下层是进程,进程是持有资源的最小单位;中层是线程,线程不持有资源,是CPU调度的最小单位;上层是协程,协程既不持有资源、也不在意CPU的调度,它仅仅关注的是“协作式的、自然的流程切换”。

异步运行时就负责调度执行上述的协程对象。例如在一个协程在等待 IO 时,这个协程会主动出让自己的执行权给异步运行时,这时异步运行时可以调度运行其他的协程,从而最大化地利用CPU时间片。在 IO 密集型的应用中,异步编程将能够极大地提高执行效率。