1. 简介
Tokio 是一个用于构建高性能异步应用程序的 Rust 异步运行时框架。它提供了基本的异步 I/O 操作、任务调度、定时器等功能,适合于构建网络服务器、客户端等。
2. 环境准备
在 Cargo.toml
中添加以下内容:
toml
[dependencies]
tokio = { version = "1", features = ["full"] }
3. 创建一个简单的异步应用
3.1. 基本异步函数
一个简单的异步函数:
rust
use tokio::time::{sleep, Duration};
async fn say_hello() {
println!("Hello, world!");
sleep(Duration::from_secs(1)).await;
println!("Goodbye, world!");
}
3.2. 运行异步任务
使用 Tokio 的运行时来运行异步任务:
rust
#[tokio::main]
async fn main() {
say_hello().await;
}
4. 异步 I/O 示例
下面是一个简单的 TCP 服务器示例,演示如何使用 Tokio 进行异步网络编程。
4.1. 创建 TCP 服务器
rust
use tokio::net::TcpListener;
use tokio::prelude::*;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:8080").await?;
println!("Server listening on 127.0.0.1:8080");
loop {
let (mut socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut buf = [0; 1024];
match socket.read(&mut buf).await {
Ok(0) => return, // 连接已关闭
Ok(n) => {
// 将数据写回客户端
if let Err(e) = socket.write_all(&buf[0..n]).await {
eprintln!("Failed to write to socket; err = {:?}", e);
}
}
Err(e) => {
eprintln!("Failed to read from socket; err = {:?}", e);
}
}
});
}
}
5. 异步任务和并发
Tokio 允许并行运行多个异步任务。
rust
#[tokio::main]
async fn main() {
let task1 = tokio::spawn(async {
// 模拟一些异步工作
sleep(Duration::from_secs(1)).await;
println!("Task 1 completed");
});
let task2 = tokio::spawn(async {
// 模拟另一些异步工作
sleep(Duration::from_secs(2)).await;
println!("Task 2 completed");
});
let _ = tokio::try_join!(task1, task2);
}
6. 使用 Tokio 的定时器
Tokio 提供了一个方便的定时器,可以用于延迟执行任务:
rust
#[tokio::main]
async fn main() {
println!("Waiting for 2 seconds...");
sleep(Duration::from_secs(2)).await;
println!("2 seconds passed!");
}
7. 错误处理
在异步代码中处理错误与同步代码类似,但通常会使用 Result
类型进行处理。
rust
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let result = do_something_async().await?;
println!("Result: {}", result);
Ok(())
}
8. 总结
Tokio 提供了强大的工具来进行异步编程。使用它,可以轻松构建高性能的网络应用。