Rust异步编程:初学者完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust 异步编程简介



异步编程是一种方法,它允许您的应用程序高效地同时执行多个任务,而不会阻塞主执行线程。在 Rust 中,这种方法通过 async/await 模型实现,该模型保证了语言固有的内存安全性和高性能。



与传统的多线程不同,异步代码在一个或多个线程内运行,在等待期间(例如,输入/输出或网络请求)在任务之间切换。这使其成为创建高负载 Web 服务器、网络应用程序和数据处理工具的理想选择。



在本文中,我们将探讨 Rust 中异步编程的基础知识:从关键概念到实际示例。您将了解 Future、async 和 await 的工作原理,熟悉流行的 Tokio 运行时,并编写您的第一个异步项目。



核心概念:Future、async 和 await



什么是 Future?



在 Rust 中,异步任务由 Future trait 表示。Future 是一个可能尚未准备好,但将在未来获得的值。每个 Future 都有一个 poll 方法,用于检查任务是否完成。如果任务仍在执行,则返回 Pending;如果完成,则返回 Ready(value)。



Future 本身不执行任何工作。它仅描述应该发生的事情。要执行异步代码,需要一个 运行时 —— 一个轮询 Future 并管理其执行的执行器。



关键字 async 和 await



关键字 async 将普通函数转换为异步函数,该函数返回一个 Future。例如:



async fn hello() -> String {    "Hello, world!".to_string()}


要从 Future 获取结果,请使用 .await。它会暂停当前函数的执行,直到 Future 完成:



let result = hello().await;println!("{}", result);


重要提示:.await 只能在异步函数或 async {} 块内使用。



异步任务的生命周期



  • 创建 Future(调用异步函数)。
  • 将 Future 传递给运行时执行。
  • 运行时通过 poll 轮询 Future。
  • 如果任务被阻塞(等待 I/O),运行时切换到另一个任务。
  • 当结果准备好时,Future 返回 Ready。


生态系统:Tokio 和 async-std



要在 Rust 中使用异步代码,需要使用 异步运行时。最流行的两个是 Tokio 和 async-std。



Tokio



Tokio 是 Rust 中异步编程的行业标准。它提供了一个多线程调度器、异步输入/输出、定时器、同步和网络协议。大多数大型项目(例如,Hyper、Tonic、Axum)都构建在 Tokio 之上。



要开始使用 Tokio,请将依赖项添加到 Cargo.toml:



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


用于启动异步代码的主要宏是 #[tokio::main]:



#[tokio::main]async fn main() {    println!("Hello from Tokio!");}


async-std



async-std 是一个替代运行时,旨在尽可能与 Rust 标准库相似。它对初学者更简单,但在生产环境中不太流行。



示例

博客

书籍推荐