Rust 异步编程完全指南:async/await 实战
Rust 的异步编程模型基于 Future trait,提供零成本抽象和高性能。本文深入讲解 Rust 异步编程的核心概念和实战技巧。
🚀 async/await 基础
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
println!("Starting...");
async_function().await;
println!("Done!");
}
async fn async_function() {
sleep(Duration::from_secs(1)).await;
println!("Async function completed");
}
📦 常用异步运行时
- Tokio:最流行的异步运行时,生态丰富
- async-std:类似 std 的异步版本
- smol:轻量级运行时
# Cargo.toml
[dependencies]
tokio = { version = "1", features = ["full"] }
🔄 并发执行多个 Future
use tokio::join;
async fn task1() { /* ... */ }
async fn task2() { /* ... */ }
// 并发执行
let (result1, result2) = join!(task1(), task2());
📡 Stream:异步迭代器
use tokio_stream::StreamExt;
let mut stream = tokio_stream::iter(vec![1, 2, 3, 4, 5]);
while let Some(value) = stream.next().await {
println!("Got: {}", value);
}
🔧 Pin 与 Unpin
Rust 异步编程中的难点:Future 可能包含自引用结构体,需要 Pin 来保证内存安全。
use std::pin::Pin;
use std::future::Future;
fn foo() -> Pin>> {
Box::pin(async {
// 异步代码
})
}
⚡ 高性能技巧
- 避免过早 await:先启动多个 Future,再 await
- 使用 buffered:限制并发数,避免资源耗尽
- 选择合适的运行时:Tokio 适合大多数场景
- 使用 tracing 进行调试:异步代码调试困难,tracing 提供强大支持
🛠️ 生态工具
- reqwest:异步 HTTP 客户端
- sqlx:异步数据库驱动
- warp/axum:异步 Web 框架
- tracing:异步日志和调试
总结:Rust 异步编程学习曲线较陡,但掌握后能编写出高性能、安全的并发程序。Tokio 生态已相当成熟,适合生产环境使用。
本文整理自 Rust 官方异步编程指南及技术社区实战教程