Futures
Future — трейт, который реализуют объекты, представляющие операцию, которая ещё может не быть завершена. Фьючерс можно опрашивать, и poll возвращает Poll.
#![allow(unused)]
fn main() {
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::pin::Pin;
use std::task::Context;
pub trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}
pub enum Poll<T> {
Ready(T),
Pending,
}
}
Асинхронная функция возвращает impl Future. Также возможно (но необычно) реализовать Future для собственных типов. Например, JoinHandle, возвращаемый из tokio::spawn, реализует Future, чтобы можно было дождаться его завершения.
Ключевое слово .await, применённое к фьючерсу, приостанавливает текущую асинхронную функцию, пока этот фьючерс не будет готов, а затем вычисляется в его результат.
-
Типы
FutureиPollреализованы именно так, как показано; нажмите на ссылки, чтобы увидеть реализации в документации. -
Contextпозволяет фьючерсу запланировать собственный повторный опрос, когда происходит событие, например таймаут. -
Pinгарантирует, что фьючерс не будет перемещён в памяти, поэтому указатели на него остаются действительными. Это нужно, чтобы ссылки оставались действительными после.await. Мы разберёмPinв сегменте «Подводные камни».