Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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, применённое к фьючерсу, приостанавливает текущую асинхронную функцию, пока этот фьючерс не будет готов, а затем вычисляется в его результат.

This slide should take about 4 minutes.
  • Типы Future и Poll реализованы именно так, как показано; нажмите на ссылки, чтобы увидеть реализации в документации.

  • Context позволяет фьючерсу запланировать собственный повторный опрос, когда происходит событие, например таймаут.

  • Pin гарантирует, что фьючерс не будет перемещён в памяти, поэтому указатели на него остаются действительными. Это нужно, чтобы ссылки оставались действительными после .await. Мы разберём Pin в сегменте «Подводные камни».