Исполнитель и точка входа в Rust
Точка ожидания работает только внутри асинхронного контекста. Снаружи исполнителя ей некуда передать управление, поэтому обычная синхронная главная функция такой код не соберет.
Пометка точки входа подключает готовый исполнитель: она превращает главную функцию в асинхронную и запускает цикл, который крутит задачи до конца программы.
Атрибут пишут прямо над главной функцией вместе с асинхронной главной:
#[tokio::main]
async fn main() {
let n = step().await;
println!("{}", n);
}
async fn step() -> i32 {
4
}
Без #[tokio::main] компилятор увидит
точку ожидания в функции, которая не
помечена как асинхронная, и остановит
сборку. С атрибутом главная функция
получает и исполнитель, и право ждать
внутри себя.
Тот же каркас с коротким сном внутри шага, чтобы исполнитель успел переключиться:
#[tokio::main]
async fn main() {
let n = step().await;
println!("{}", n);
}
async fn step() -> i32 {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
6
}
Дано число:
let num = 8;
Пометьте главную функцию атрибутом исполнителя, верните этот литерал из асинхронного шага и выведите его.
Скажите, зачем точке ожидания нужен исполнитель снаружи асинхронной функции.
Дано число:
let num = 1;
Уберите атрибут с главной функции, оставив точку ожидания внутри. Опишите, какую ошибку сборки увидите.