Rust Async 异步编程(十一):Async 生态
Rust Async 异步编程(十一):Async 生态
Rust 目前只提供编写 async 代码的基本要素,标准库中尚未提供执行器、任务、反应器、组合器以及低级 I/O Future 和 trait。
社区提供的 async 生态系统填补了这些空白。
Async Runtime
Async 运行时是用于执行 async 应用程序的库。
它通常将一个反应器和一个或多个执行器绑定在一起。
- 反应器为异步 I/O、进程间通信和计时器等外部事件提供订阅机制。在 Async 运行时中,订阅者通常是代表低级别 I/O 操作的 Future。
- 执行器负责安排和执行任务。它们跟踪正在运行和暂停的任务,对 Future 进行 poll 直到完成,并在任务能够取得进展时唤醒任务。
执行器一词经常与运行时互换使用。
我们用生态系统一词来描述一个与兼容 trait 和特性捆绑在一起的运行时。
社区提供的 async crates
futures crate:提供了 Stream、Sink、AsyncRead、AsyncWrite 等 trait,以及组合器等工具。
这些可能最终成为标准库的一部分。
futures 有自己的执行器,但没有自己的反应器,因此它不支持 async I/O 或计时器 Future 的执行。因此,futures 不被认为是一个完整的运行时。
常见的选择是:与另一个 crate 中的执行器一起使用来自 futures 提供的工具。
流行的运行时
- tokio:一个流行的 async 生态系统,包含 HTTP、gRPC 和跟踪框架
- async-std:提供标准库的 async 副本
- smol:小型、简化的 async 运行时,提供可用于包装 UnixStream 或 TcpListener 等结构的 async trait
- fuchsia-async:用于 Fuchsia OS 的执行器
确定生态兼容性
与 async I/O、计时器、进程间通信或任务交互的 async 代码通常取决于特定的异步执行器或反应器。
所有其他 async 代码,如异步表达式、组合器、同步类型和流,通常与生态系统无关,前提是任何嵌套的 Future 也与生态系统无关。
在开始一个项目之前, 建议研究相关的 async 框架和库,以确保与你选择的运行时以及彼此之间的兼容性。
单线程 vs 多线程执行器
async 执行器可以是单线程或多线程的。
多线程执行器可以在多个任务上同时取得进展,对于有许多任务的工作负载,它可以大大加快执行速度,但在任务之间同步数据通常更昂贵。
在单线程运行时和多线程运行时之间进行选择时,建议测量应用程序的性能。
任务可以在创建它们的线程上运行,也可以在单独的线程上运行。
异步运行时通常提供将任务生成到单独线程的功能。即使任务在不同的线程上执行,它们也应该是非阻塞的。
为了在多线程执行器上调度任务,它们必须是 Send 的。
一些运行时提供了生成非 Send 的任务的函数,确保每个任务都在生成它的线程上执行。它们还可以提供将阻塞任务生成到专用线程的函数,这对于运行来自其他库的阻塞同步代码非常有用。
参考
- https://github.com/rustcn-org/async-book
- https://www.bilibili.com/video/BV1Ki4y1C7gj
1221

被折叠的 条评论
为什么被折叠?



