面试题答案
一键面试Future
概念
在Rust异步编程中,Future
是一个代表异步计算的类型。它描述了一个可能尚未完成的操作,并且可以通过poll
方法查询其状态。Future
trait定义如下:
trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}
Future
的Output
关联类型表示异步操作完成时返回的类型。
Poll
概念
Poll
是一个枚举,用于表示Future
的状态。它定义在std::task
模块中:
pub enum Poll<T> {
Ready(T),
Pending,
}
Poll::Ready(T)
:表示Future
已经完成,并且返回值为T
。Poll::Pending
:表示Future
尚未完成,需要再次轮询。
Future
和Poll
的关系
Future
的poll
方法返回一个Poll
值,用于告知调用者Future
的当前状态。调用者(例如async
运行时)会根据返回的Poll
值来决定下一步操作。如果返回Poll::Pending
,调用者会在适当的时候再次调用poll
方法,直到返回Poll::Ready
。
手动实现简单Future
示例
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
// 定义一个简单的Future结构体
struct MyFuture {
state: i32,
}
// 实现Future trait
impl Future for MyFuture {
type Output = i32;
fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.get_mut();
if this.state < 10 {
this.state += 1;
Poll::Pending
} else {
Poll::Ready(this.state)
}
}
}
fn main() {
let mut future = MyFuture { state: 0 };
let mut context = std::task::Context::from_waker(&std::task::noop_waker());
loop {
match future.as_mut().poll(&mut context) {
Poll::Ready(result) => {
println!("Future completed with result: {}", result);
break;
}
Poll::Pending => {
println!("Future is still pending");
}
}
}
}
在这个例子中,MyFuture
结构体实现了Future
trait。poll
方法根据state
的值决定返回Poll::Pending
还是Poll::Ready
。在main
函数中,手动轮询MyFuture
,直到它返回Poll::Ready
。