Rust 异步编程
Rust 的异步和 JavaScript、Python 都不一样:它没有内置运行时。语言只提供了 Future 这个 trait 和 async/await 语法糖,真正的调度由社区 crate(最主流的是 Tokio)完成。这正是「零成本抽象」的体现——你不为用不到的调度器买单。
什么是 Future
Future 是一个「未来才会产出值」的计算:
use Future;
use Pin;
use ;
// 一个最简单的 Future:等一秒后返回 42
关键在于 poll:Future 不会自己跑,是运行时反复来「戳」它。返回 Pending 表示还没好,返回 Ready 表示出结果了。
async/await 语法
手写 poll 太反人类,所以有了 async:
async
async
async fn 编译后就是一个返回 Future 的状态机;await 点上,状态机暂停、把控制权交还运行时。
Tokio 运行时
#[tokio::main] 帮你启动一个多线程调度器。并发跑多个任务用 tokio::join! 或 spawn:
let = join!;
三个常见坑
- 在异步里调阻塞函数(如
std::thread::sleep)会卡住整个线程——改用tokio::time::sleep。 await不加.await——编译器不会报错,但 Future 永远不会执行。- 跨
.await持有&mut引用容易触发借用检查器的「终身追杀」,多用Arc<Mutex<T>>解耦。
异步 Rust 难,是因为它把并发的复杂性诚实地摆在你面前,而不是藏在运行时底下。熬过前两周,你会感谢它的严谨。