包龙星

我现在要同时处理三个案子。如果等第一个案子审完再审第二个,那得等到猴年马月?

包有为

十三叔,用异步 (Async)!审第一个案子如果卡住了(比如等证人),马上切换去审第二个,别闲着!

Rust 异步编程:时间管理大师

异步编程允许程序在等待耗时操作(如 IO)完成时,去执行其他任务,而不是阻塞在那里。

⏳ async 和 .await

使用 async 标记的代码块会返回一个 Future,它是一个“承诺”,代表未来会产生一个值。

// 定义异步函数
async fn solve_case() {
    println!("案子破了!");
}

async fn main_work() {
    // 调用异步函数,如果不 await,它什么都不做!
    let future = solve_case();
    
    // 等待结果
    future.await;
}

🏃‍♂️ 运行时 (Runtime)

Rust 标准库没有内置异步运行时,通常使用社区库 Tokio

use tokio;

#[tokio::main]
async fn main() {
    println!("开始工作...");
    
    let f1 = solve_case_1();
    let f2 = solve_case_2();
    
    // 并发执行
    tokio::join!(f1, f2);
    
    println!("全部搞定!");
}

async fn solve_case_1() {
    // 模拟耗时操作
    tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
    println!("案子 1 破了");
}

async fn solve_case_2() {
    println!("案子 2 破了");
}
⏱️

动手时刻:一心二用

你需要引入 tokio 依赖才能运行此代码(Cargo.toml 中添加 tokio = { version = "1", features = ["full"] })。

这里我们模拟逻辑:

  1. 定义两个异步任务:boil_water (烧水) 和 cut_fruit (切水果)。
  2. 烧水需要 2 秒,切水果瞬间完成。
  3. 在 main 中同时启动它们,看看谁先完成。
查看参考答案 (点击揭榜)

use tokio::time::{sleep, Duration};

async fn boil_water() {
    println!("开始烧水...");
    sleep(Duration::from_secs(2)).await;
    println!("水开了!");
}

async fn cut_fruit() {
    println!("开始切水果...");
    println!("水果切好了!");
}

#[tokio::main]
async fn main() {
    // join! 宏让两个 future 并发跑
    tokio::join!(boil_water(), cut_fruit());
}
                    

成就解锁:【时间管理大师】 🕰️