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 的任务的函数,确保每个任务都在生成它的线程上执行。它们还可以提供将阻塞任务生成到专用线程的函数,这对于运行来自其他库的阻塞同步代码非常有用。

参考

  1. https://github.com/rustcn-org/async-book
  2. https://www.bilibili.com/video/BV1Ki4y1C7gj
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值