Модуль 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 - система уведомлений о готовности
Эта система позволяет писать высокопроизводительные асинхронные приложения с минимальными накладными расходами.