Задачу Task можно ожидать (await) для получения результата ее фьючерса.
Удаление (dropping) задачи Task отменяет ее, что означает, что ее фьючерс больше не будет опрашиваться. Чтобы удалить дескриптор задачи без ее отмены, используйте вместо этого метод detach(). Для грациозной отмены задачи и ожидания ее полного уничтожения используйте метод cancel().
Важно: отмена задачи фактически пробуждает ее и перепланирует один последний раз. Затем исполнитель может уничтожить задачу, просто удалив ее Runnable или вызвав run().
#![allow(unused)]
fn main() {
use smol::{future, Executor};
use std::thread;
let ex = Executor::new();
// Запускаем фьючерс в исполнителе.
let task = ex.spawn(async {
println!("Hello from a task!");
1 + 2
});
// Запускаем поток исполнителя.
thread::spawn(move || future::block_on(ex.run(future::pending::<()>())));
// Ожидаем результат задачи.
assert_eq!(future::block_on(task), 3);
}
Ожидание результата: Задачи можно ожидать через await для получения результата
Автоматическая отмена: Удаление задачи приводит к ее отмене
Грациозная отмена: Метод cancel() обеспечивает корректное завершение
Фоновое выполнение: detach() позволяет задаче работать в фоне
#![allow(unused)]
fn main() {
use smol::{future, Executor};
use std::thread;
let ex = Executor::new();
// Запуск задачи в исполнителе
let task = ex.spawn(async {
println!("Hello from a task!");
1 + 2
});
// Ожидание результата
assert_eq!(future::block_on(task), 3);
}
#![allow(unused)]
fn main() {
use smol::{future, Executor, Timer};
use std::thread;
use std::time::Duration;
let ex = Executor::new();
let task = ex.spawn(async {
loop {
println!("You can still cancel me!");
Timer::after(Duration::from_secs(1)).await;
}
});
future::block_on(async {
Timer::after(Duration::from_secs(3)).await;
task.cancel().await; // Грациозная отмена
});
}