面试题答案
一键面试Future和Async基本概念
- Future:
- 在Rust中,
Future
是一个异步计算的抽象,表示一个可能还没有完成的值。它定义在std::future::Future
trait中。Future
通常用于描述一个异步操作,这个操作可能会花费一些时间才能完成,例如网络请求、文件读取等。Future
并不立即执行异步计算,而是当Future
被poll
时,它会尝试推进异步操作,直到操作完成或需要等待更多资源。
- 在Rust中,
- Async:
async
是Rust中的一个关键字,用于定义异步函数。异步函数返回一个实现了Future
trait的类型。当调用一个async
函数时,函数体并不会立即执行,而是返回一个Future
。这个Future
可以被poll
,逐步执行异步函数体中的代码。async
函数内部可以使用.await
暂停执行,等待另一个Future
完成。
示例
use std::time::Duration;
use tokio::time::sleep;
// 创建一个简单的异步任务
async fn async_task() {
println!("开始异步任务");
// 使用.await暂停异步任务的执行直到其完成
sleep(Duration::from_secs(2)).await;
println!("异步任务完成");
}
在上述代码中:
async fn async_task()
定义了一个异步函数async_task
,它返回一个实现了Future
trait的类型(这里编译器会自动推断具体类型)。sleep(Duration::from_secs(2)).await;
使用.await
暂停async_task
的执行,直到sleep
这个异步操作(返回一个Future
)完成,也就是等待2秒。在此期间,async_task
函数的执行被暂停,其他任务可以被调度执行。- 当
sleep
完成后,async_task
继续执行,打印出“异步任务完成”。
要运行这个异步任务,通常需要一个异步运行时,例如Tokio
:
#[tokio::main]
async fn main() {
async_task().await;
}
在这个例子中,#[tokio::main]
宏创建了一个Tokio
运行时,并在这个运行时中执行main
函数,main
函数中又调用并等待async_task
完成。