Tokio

Tokio provides:

  • 用于执行异步代码的多线程运行时。
  • An asynchronous version of the standard library.
  • 庞大的库生态系统。
use tokio::time;

async fn count_to(count: i32) {
    for i in 1..=count {
        println!("Count in task: {i}!");
        time::sleep(time::Duration::from_millis(5)).await;
    }
}

#[tokio::main]
async fn main() {
    tokio::spawn(count_to(10));

    for i in 1..5 {
        println!("Main task: {i}");
        time::sleep(time::Duration::from_millis(5)).await;
    }
}
  • 借助 tokio::main 宏,我们现在可以将 main 设为异步函数。

  • spawn 函数会创建新的并发 “任务”。

  • 注意:spawn 使用 Future 方法实现,而不是对 count_to 调用 .await

深入探索

  • 为何 count_to 通常无法计数到 10?这是一个异步取消的示例。tokio::spawn 会返回一个句柄,可以等待该句柄直至其代表的任务执行完毕。

  • 尝试使用 count_to(10).await,而不是派生方法。

  • 尝试等待 tokio::spawn 返回的任务执行完毕。