Rust Tokio 异步编程入门
wxk1991 Lv5

Rust Tokio 异步编程入门

Rust 标准库提供了 asyncawait 语法,但并不自带完整异步运行时。实际项目中,Tokio 是最常见的选择,尤其适合网络服务、任务调度和高并发 IO。


一、最小示例

创建项目后添加依赖:

1
2
[dependencies]
tokio = { version = "1", features = ["full"] }

入口函数可以这样写:

1
2
3
4
#[tokio::main]
async fn main() {
println!("hello tokio");
}

#[tokio::main] 会帮你创建运行时。


二、async fn 不会立即执行

调用异步函数会得到一个 Future,只有 .await 后才会真正推进:

1
2
3
4
5
6
7
8
9
async fn fetch_user() -> String {
String::from("Alice")
}

#[tokio::main]
async fn main() {
let name = fetch_user().await;
println!("{}", name);
}

这是理解 Rust 异步的关键。


三、并发执行任务

可以用 tokio::spawn 创建异步任务:

1
2
3
4
5
6
7
8
#[tokio::main]
async fn main() {
let task = tokio::spawn(async {
println!("running in task");
});

task.await.unwrap();
}

spawn 的任务需要满足线程安全要求,这也是 Rust 在异步并发里比较严格的地方。


四、不要阻塞运行时线程

在异步函数里直接执行耗时 CPU 操作或阻塞 IO,会影响运行时调度。文件、网络、定时器等尽量使用 Tokio 提供的异步版本。

1
tokio::time::sleep(std::time::Duration::from_secs(1)).await;

五、适合使用 Tokio 的场景

Tokio 很适合:

  • HTTP API 服务
  • TCP、UDP、WebSocket 服务
  • 高并发爬虫和任务调度
  • 消息队列消费者

如果程序主要是 CPU 密集计算,异步不一定能提升性能。先分清瓶颈,再决定是否引入 Tokio。