Асинхронность в Rust реализуется через Future — объект, представляющий работу, результат которой будет получен в будущем. Функции, объявленные с помощью async fn, возвращают анонимную структуру-генератор, реализующую трейт Future. Для запуска асинхронного кода используется рантайм (например, Tokio или async-std), поскольку стандартная библиотека не содержит встроенного event loop.
Главные особенности Rust:
Пример:
use tokio::time::sleep; use std::time::Duration; async fn foo() { println!("Hello"); sleep(Duration::from_secs(1)).await; println!("World!"); } #[tokio::main] async fn main() { foo().await; }
Может ли асинхронная функция в Rust по умолчанию быть выполнена сразу при вызове? Почему?
Ответ:
Нет. Вызов async fn возвращает не результат, а объект типа Future (state machine). Для реального выполнения требуется вызвать .await или передать Future рантайму. Сам вызов только создает описание задачи, но не выполняет её.
Пример:
async fn answer() -> u32 { 42 } let fut = answer(); // тут нет выполнения, только создание future let result = fut.await; // выполнение начинается здесь
История
.await. Из-за этого основные потоки выполнялись синхронно, что привело к просадке по производительности и росту времени отклика в 3 раза.История
История
Один из членов команды забыл про Send/Sync ограничения на типы, использующиеся внутри Future. При попытке поделиться future между потоками приложение упало с ошибкой компиляции, требующей реализации Send для определённой структуры, что потребовало пересмотра архитектуры хранения состояния.