Tokio 概览
Tokio 作为主流 async 运行时的定位:执行器、I/O、定时器、任务与何时引入。
#type / concept
#status / growing
#tech / dev
#resource / rust
[!info] 关联笔记
Tokio 概览
这个概念为什么出现
标准库定义了 Future,但没有完整的生产级网络运行时。
Tokio 提供多线程执行器、异步 I/O、定时器、同步原语与生态(hyper 等)基础。
[!abstract] 一句话理解 Tokio 是 Rust 主流 async 运行时:驱动 Future、提供 async I/O 与工具;语言 async 语法 + Tokio(或其他运行时)才组成可上线服务。
最小可运行示例
场景:选择运行时——文档级最小形态
以下展示典型入口形状(需在 Cargo.toml 依赖 tokio 才能编译运行)。
// Cargo.toml 依赖示例:
// tokio = { version = "1", features = ["full"] }
//
// 业务意图:启动运行时并并发等两个定时器。
// 教学点:#[tokio::main];tokio::spawn;time::sleep。
/*
#[tokio::main]
async fn main() {
let h = tokio::spawn(async {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
"worker-done"
});
tokio::time::sleep(std::time::Duration::from_millis(5)).await;
println!("main-progress");
println!("{}", h.await.unwrap());
}
*/
fn main() {
println!("add tokio dependency to run the async sample above");
}
建议:按注释加入依赖后 cargo run。
结合场景再看三个关注点
- 运行时是依赖不是语言内置
- feature 可裁剪 减体积
- 与 hyper/axum/tonic 生态衔接
核心概念与准确模型
| 组件 | 作用 |
|---|---|
| Runtime | 调度任务 |
tokio::spawn | 任务并发 |
tokio::io / net | 异步 I/O |
sync | 异步锁/channel |
time | 睡眠/间隔/超时 |
多线程 vs current_thread 运行时选型看负载。
设计动机
- 生产可用的异步栈
- 性能与功能平衡
- 社区事实标准之一
边界与误区
- 在 async 中调用阻塞 std I/O
- 运行时嵌套不当
- 版本与 feature 不匹配
[!warning] 常见误区:所有 Rust 项目都要 Tokio CLI/CPU 工具可能不需要。
工程实践
- 显式 features
- 统一超时/取消
- 指标:任务排队、I/O
- 优雅关闭:
signal+ 中止 spawn
本节总结
- Tokio = 执行器 + async 设施
- 服务开发常用底座
- 先懂 Future 再绑运行时
自测题
- 没有 Tokio 能写 async fn 吗?
spawn与直接 await 的差异?
参考答案
- 能写,但需要某个执行器来跑。
- spawn 并发调度;直接 await 在当前任务内顺序推进。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Tokio 官网 | 生态 | 总览 |
| Tokio tutorial | 文档 | 入门 |
| docs.rs/tokio | API | 模块 |