Rust 中的 Async

  • Future是惰性的。只有 poll 时才能取得进展;被丢弃的 future 就无法取得进展了
  • Async 是零成本的。可以无需堆内存分配(heap allocation)和动态调度(dynamic dispatch),对性能较好,且允许在受限环境使用 async
  • 不提供内置运行时,运行时由社区提供
  • 单线程、多线程均支持,但优缺点不同

Rust 中的 async 和 thread

OS线程:
适用于少量任务,有内存和CPU开销,且线程生成和线程间切换非常昂贵
线程池可以降低一些成本
允许重用同步代码,代码无需大改,无需特定编程模型
有些系统支持修改线程优先级

Async :
显著降低内存和CPU开销
同等条件下,支持比线程多几个数量级的任务(少数线程支撑大量任务)
可执行文件大(需要生成状态机,每个可执行文件捆绑一个异步运行时)

Async 并不比线程好,只是不同而已。

虽然 Rust 本身就支持 async 编程,但很多应用依赖于社区的库:

  • 标准库提供了最基本的特性、类型和功能,例如 Future trait
  • async/await 语法直接被 Rust 编译器支持
  • futures crate 提供了许多实用类型、宏和函数。它们可以用于任何异步应用程序。
  • 异步代码、IO 和任务生成的执行由 async runtimes 提供,例如 Tokio 和 async-std。大多数 async 应用程序和一些 async crate 都依赖于特定的运行时。

Rust trait 不支持 async。

兼容性说明
async和同步代码不能总是自由组合。例如:不能直接从同步函数来调用异步函数。async 代码间也不总是能自由组合。一些 crate 依赖于特定的 async 运行时。因此,尽早研究确定使用哪个 async 运行时。


本站由 江湖浪子 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。