Метод poll класса Future
Метод poll опрашивает Future и проверяет,
завершено ли его вычисление. Он возвращает значение
типа Poll: либо Poll::Ready с готовым
результатом, либо Poll::Pending, если результат
ещё не готов. Параметром метод принимает контекст
Context, который содержит Waker для
уведомления исполнителя о готовности Future.
Синтаксис
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>
Пример
Давайте создадим простой Future, который сразу
возвращает готовое значение 42:
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
struct ReadyFuture;
impl Future for ReadyFuture
{
type Output = i32;
fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output>
{
Poll::Ready(42)
}
}
fn main()
{
let mut future = ReadyFuture;
let mut cx = Context::from_waker(futures::task::noop_waker_ref());
let pinned = Pin::new(&mut future);
let res = pinned.poll(&mut cx);
println!("{:?}", res);
}
Результат выполнения кода:
Ready(42)
Пример
Давайте создадим Future, который при первом опросе
возвращает Poll::Pending, а при повторном -
Poll::Ready:
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
struct PendingFuture
{
ready: bool,
}
impl Future for PendingFuture
{
type Output = &'static str;
fn poll(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output>
{
if self.ready
{
Poll::Ready("done")
}
else
{
self.ready = true;
Poll::Pending
}
}
}
fn main()
{
let mut future = PendingFuture { ready: false };
let mut cx = Context::from_waker(futures::task::noop_waker_ref());
let res1 = Pin::new(&mut future).poll(&mut cx);
println!("{:?}", res1);
let res2 = Pin::new(&mut future).poll(&mut cx);
println!("{:?}", res2);
}
Результат выполнения кода:
Pending
Ready("done")