什么是 Tokio,为什么需要它?
Tokio 是 Rust 编程语言的异步运行时。它为编写快速、可靠且可扩展的网络应用程序提供了基础设施。如果你用 Rust 编写涉及网络、文件或需要无阻塞线程的并行请求处理的内容,那么你需要 Tokio。
与传统的多线程方法(每个请求在单独的 OS 线程中处理,成本高且有限)不同,Tokio 使用基于事件的异步 I/O 模型。单个线程可以处理数千个同时打开的连接,仅在当前任务等待时(例如,从套接字读取)在任务之间切换。
Tokio 不仅仅是一个库,它还是一个生态系统。它包括:
- 运行时 — 任务调度器和事件驱动(epoll/kqueue/IOCP)
- 标准网络协议 — TCP、UDP、Unix 套接字
- 定时器 — sleep、interval、deadline
- 同步 — 用于异步代码的互斥锁、信号量、屏障
- 文件 I/O — 异步文件读/写
- 工具 — 通道(mpsc、oneshot、broadcast)、缓冲区、编解码器
Tokio 是许多知名项目的基础,例如 Web 框架 Axum、HTTP 客户端 Reqwest、WebSocket Tungstenite、数据库 SQLx 等。
安装
与 Python(pip)或 Node.js(npm)不同,Rust 使用 Cargo 包管理系统。要安装 Tokio,请在 Cargo.toml 文件中添加依赖项:
[dependencies]tokio = { version = "1", features = ["full"] }features = ["full"] 标志启用 Tokio 的所有功能。对于生产项目,建议只选择所需的功能,以减少编译时间和二进制文件大小:
[dependencies]tokio = { version = "1", features = ["rt", "macros", "net", "io-util", "time", "sync"] }主要功能:
rt— 多线程运行时macros— 宏#[tokio::main]和tokio::select!net— TCP、UDP、Unix 套接字io-util— 异步 Reader/Writertime— 定时器和 sleepsync— 同步原语fs— 异步文件系统操作process— 异步命令执行signal— OS 信号处理
快速入门
让我们创建一个简单的 HTTP 服务器,它对任何请求都响应 "Hello, World!"。为此,我们还需要 crate hyper(基于 Tokio 的 HTTP 库):
// Cargo.toml// [dependencies]// tokio = { version = "1", features = ["full"] }// hyper = { version = "1", features = ["server", "http1"] }
use hyper::service::service_fn;use hyper::{Request, Response, Server};use hyper::body::Incoming;use std::convert::Infallible;
async fn handle_request(_req: Request<Incoming>) -> Result<Response<String>, Infallible> { Ok(Response::new("Hello, World!".to_string()))}
#[tokio::main]async fn main() { let addr = ([127, 0, 0, 1], 3000).into(); let server = Server::bind(&addr).serve(service_fn(handle_request)); println!("Server running on http://{}", addr); if let Err(e) = server.await { eprintln!("Server error: {}", e); }}运行 cargo run 并在浏览器中打开 http://127.0.0.1:3000。你将看到 "Hello, World!"。