面试题答案
一键面试选择的异步原语及原因
async/await
:这是Rust中处理异步代码的核心语法。它允许我们以一种看似同步的方式编写异步代码,极大地提高了代码的可读性。通过await
关键字,可以暂停当前异步函数的执行,直到被等待的Future
完成。tokio
:它是一个基于async/await
构建的Rust异步运行时。tokio
提供了诸如任务调度、I/O驱动等功能,使异步编程更加方便。在这里,我们使用tokio
来运行异步任务。futures::join
:futures
库中的join
函数可以并行运行多个Future
,并等待它们全部完成。这对于我们任务B和任务C并行执行并等待它们完成的场景非常适用。
代码示例
use futures::join;
use tokio;
// 模拟任务A
async fn task_a() {
println!("Task A is running");
// 模拟一些工作
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
println!("Task A is done");
}
// 模拟任务B
async fn task_b() {
println!("Task B is running");
// 模拟一些工作
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
println!("Task B is done");
}
// 模拟任务C
async fn task_c() {
println!("Task C is running");
// 模拟一些工作
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
println!("Task C is done");
}
// 模拟任务D
async fn task_d() {
println!("Task D is running");
// 模拟一些工作
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
println!("Task D is done");
}
#[tokio::main]
async fn main() {
// 执行任务A
task_a().await;
// 并行执行任务B和任务C
let (result_b, result_c) = join!(task_b(), task_c());
// 任务B和任务C都完成后执行任务D
task_d().await;
}
在上述代码中:
task_a
:模拟任务A,通过await
暂停执行来模拟实际工作。task_b
和task_c
:分别模拟任务B和任务C,同样通过await
暂停执行来模拟实际工作。task_d
:模拟任务D,在任务B和任务C完成后执行。main
函数:使用tokio::main
宏来启动tokio
运行时。先执行任务A,然后通过join!
宏并行执行任务B和任务C,最后执行任务D。