MST

星途 面试题库

面试题:Rust中Tokio异步任务的基础使用

在Rust中使用Tokio构建一个简单的异步应用,该应用启动两个异步任务,一个任务每秒打印一次`Task 1 is running`,另一个任务每两秒打印一次`Task 2 is running`,直到程序运行5秒后结束。请写出完整代码,并解释`tokio::spawn`和`await`的作用。
13.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use tokio;
use std::time::Duration;

#[tokio::main]
async fn main() {
    let task1 = tokio::spawn(async move {
        loop {
            println!("Task 1 is running");
            tokio::time::sleep(Duration::from_secs(1)).await;
        }
    });

    let task2 = tokio::spawn(async move {
        loop {
            println!("Task 2 is running");
            tokio::time::sleep(Duration::from_secs(2)).await;
        }
    });

    tokio::time::sleep(Duration::from_secs(5)).await;
    task1.abort();
    task2.abort();
}

tokio::spawn的作用

tokio::spawn用于在Tokio运行时中创建并启动一个新的异步任务。它接收一个实现了Future trait的异步块或函数,并将其作为一个独立的任务调度到Tokio运行时中执行。这样可以让多个异步任务并发执行,提高程序的执行效率。例如上述代码中,tokio::spawn(async move {... })分别创建了两个异步任务task1task2,这两个任务会在Tokio运行时的调度下并发运行。

await的作用

await用于暂停当前异步函数的执行,直到其所等待的Future完成。当遇到await时,异步函数会将控制权交回给Tokio运行时,运行时可以调度其他任务执行。一旦所等待的Future完成,await表达式会返回Future的结果,异步函数继续从暂停的地方执行。比如在tokio::time::sleep(Duration::from_secs(1)).await;这行代码中,await使得当前任务暂停执行1秒,在这1秒内,Tokio运行时可以调度其他任务,1秒后任务恢复执行并继续后续代码。