Модуль future

Базовая асинхронная функциональность.

Для получения дополнительной информации об асинхронном программировании в Rust обратитесь к основным ключевым словам async и await, а также к книге по асинхронному программированию.

Макросы

join

Экспериментальный Одновременно опрашивает несколько фьючеров, возвращая кортеж со всеми результатами после их завершения.

Структуры

Pending

Создает фьючер, который никогда не разрешается, представляя вычисление, которое никогда не завершается.

PollFn

Фьючер, который оборачивает функцию, возвращающую Poll.

Ready

Фьючер, который немедленно готов со значением.

Трейты

Future

Фьючер представляет асинхронное вычисление, обычно получаемое с помощью async.

IntoFuture

Преобразование в Future.

AsyncDrop

Экспериментальный Асинхронная версия трейта Drop.

Функции

pending

Создает фьючер, который никогда не разрешается, представляя вычисление, которое никогда не завершается.

poll_fn

Создает фьючер, который оборачивает функцию, возвращающую Poll.

ready

Создает фьючер, который немедленно готов со значением.

async_drop_in_place

Экспериментальный Асинхронное удаление.

Future в Rust: концепция и механизм работы

Что такое Future?

Future (фьючер, будущее значение) - это асинхронный аналог Option или Result, который представляет значение, которое может быть доступно в некоторый момент в будущем.

Проще говоря:

  • Future = обещание результата, который будет вычислен асинхронно
  • Это значение, которое "еще не готово", но будет доступно позже

Базовое определение

#![allow(unused)]
fn main() {
pub trait Future {
    type Output;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

pub enum Poll<T> {
    Ready(T),
    Pending,
}
}

Как работает Future?

1. Ленивая природа

Фьючеры не выполняются автоматически - они должны быть явно "запущены" с помощью исполнителя (executor):

#![allow(unused)]
fn main() {
// Фьючер создан, но не выполняется
let future = async { 42 };

// Чтобы выполнить, нужен исполнитель:
// let result = executor::block_on(future);
}

2. Механизм опроса (Polling)

Система работает по принципу "опроса":

  • Исполнитель периодически "опрашивает" фьючер: future.poll()
  • Фьючер возвращает:
    • Poll::Ready(value) - результат готов
    • Poll::Pending - результат еще не готов

3. Await - синтаксический сахар

Ключевое слово await скрывает сложность опроса:

#![allow(unused)]
fn main() {
async fn example() {
    let result = some_async_function().await;
    // Эквивалентно многократным вызовам poll() до получения Ready
}
}

Жизненный цикл Future

Создание → Опрос (Pending) → ... → Опрос (Ready) → Завершение
         ↑
         └── Исполнитель повторяет опрос

Практический пример

#![allow(unused)]
fn main() {
use std::future::Future;
use std::task::{Context, Poll};
use std::pin::Pin;

struct SimpleFuture {
    completed: bool,
}

impl Future for SimpleFuture {
    type Output = i32;
    
    fn poll(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
        if self.completed {
            Poll::Ready(42)
        } else {
            self.completed = true;
            Poll::Pending
        }
    }
}
}

Эко-система

Future является частью трехуровневой системы:

  • Future - базовый трейт
  • Executor - планировщик выполнения
  • Reactor/Waker - система уведомлений о готовности

Эта система позволяет писать высокопроизводительные асинхронные приложения с минимальными накладными расходами.