Tokio:Rust 异步编程绕不开的运行时
Tokio:Rust 异步编程绕不开的运行时
玩 Rust 的人,大概率迟早会碰到 Tokio。
打开任何一个稍微有点规模的 Rust 网络项目,翻翻 Cargo.toml,十有八九能看到 tokio 这个依赖。截至现在,它在 GitHub 上拿到了 3.2 万颗星,在 Rust 生态里算是现象级的存在了。

Tokio 是干什么的
简单说,Tokio 就是一个异步运行时。Rust 语言本身实现了 async/await 语法,但没有内置运行时。你写了异步代码,得有个东西帮你调度和执行,Tokio 干的就是这个活。
它提供的核心组件包括:
- 一个多线程任务调度器,用的是工作窃取算法
- 一个基于操作系统事件队列的 I/O 反应器(Linux 上是 epoll,macOS 上是 kqueue,Windows 上是 IOCP)
- 异步 TCP/UDP 网络支持
这三个东西组合在一起,基本覆盖了写网络应用需要的底层基础设施。
上手有多快
看一段代码就知道了。下面是一个 TCP 回声服务器:
use tokio::net::TcpListener;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buf = [0; 1024];
loop {
let n = match socket.read(&mut buf).await {
Ok(0) => return,
Ok(n) => n,
Err(_) => return,
};
if socket.write_all(&buf[0..n]).await.is_err() {
return;
}
}
});
}
}
Cargo.toml 里加一行依赖,tokio = { version = "1", features = ["full"] },就能跑起来。代码量很少,逻辑也清楚:监听端口,来连接就起一个任务处理。
生态才是真正的护城河
Tokio 围绕自身建立了一套完整的库体系:
axum:Web 框架hyper:HTTP 实现tonic:gRPC 框架tower:中间件抽象层tracing:日志和追踪

这些库彼此配合,选用 Tokio 基本等于选了一条完整的技术路线。社区资源和文档都很齐全,遇到问题搜一下,大部分情况都能找到前人的经验。
关于维护
Tokio 的更新频率大概是一个月一个次版本,bugfix 按需发 patch。它采用滚动 LTS 制度,每个 LTS 版本至少维护一年。目前还在支持期内的 LTS 版本有 1.47.x(到 2026 年 9 月)和 1.51.x(到 2027 年 3 月)。如果项目要求版本锁定,可以用波浪号指定,比如 version = "~1.51"。
另外值得一提的是,Tokio 还有自己的年度会议 TokioConf。对于一个开源运行时来说,能办起自己的技术会议,说明背后有足够活跃的社区和商业支撑。
适合谁用
如果你在写 Rust 网络服务、API 后端、消息队列消费者这类东西,Tokio 几乎是默认选择。它的性能经过大量生产环境验证,API 设计在异步运行时里算是做得比较清晰的。
如果你完全没接触过 Rust 异步编程,建议先看看 Tokio 官方的 Tutorial,从头走一遍,比直接上手项目效率高。
行时里算是做得比较清晰的。
如果你完全没接触过 Rust 异步编程,建议先看看 Tokio 官方的 Tutorial,从头走一遍,比直接上手项目效率高。
更多推荐


所有评论(0)