Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Структура Task

Источник: Документация smol::Task

#![allow(unused)]
fn main() {
pub struct Task<T, M = ()> { /* private fields */ }
}

Запущенная задача.

Описание

Задачу Task можно ожидать (await) для получения результата ее фьючерса.

Удаление (dropping) задачи Task отменяет ее, что означает, что ее фьючерс больше не будет опрашиваться. Чтобы удалить дескриптор задачи без ее отмены, используйте вместо этого метод detach(). Для грациозной отмены задачи и ожидания ее полного уничтожения используйте метод cancel().

Важно: отмена задачи фактически пробуждает ее и перепланирует один последний раз. Затем исполнитель может уничтожить задачу, просто удалив ее Runnable или вызвав run().

Параметры типа

  • T - тип результата, возвращаемого задачей
  • M - тип метаданных (по умолчанию ())

Примеры

#![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() позволяет задаче работать в фоне

Основные методы

МетодСигнатураВозвращаемый типОписание
detachpub fn detach(self)()Отсоединяет задачу для фонового выполнения
cancelpub async fn cancel(self) -> Option<T>Option<T>Отменяет задачу и ждет завершения
falliblepub fn fallible(self) -> FallibleTask<T, M>FallibleTask<T, M>Преобразует в FallibleTask
is_finishedpub fn is_finished(&self) -> boolboolПроверяет завершена ли задача
metadatapub fn metadata(&self) -> &M&MВозвращает метаданные задачи

Подробное описание методов

Управление выполнением

МетодНазначениеОсобенностиПример использования
detachОтсоединяет задачуЗадача продолжает работать в фонеtask.detach()
cancelГрациозная отменаЖдет завершения, возвращает результатtask.cancel().await
fallibleСоздает fallible версиюОбрабатывает отмену через Nonetask.fallible()

Состояние и метаданные

МетодНазначениеПримечания
is_finishedПроверка состоянияМожет измениться сразу после вызова
metadataДоступ к метаданнымПо умолчанию ()

Примеры использования

Базовое использование

#![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::{Executor, Timer};
use std::time::Duration;

let ex = Executor::new();

// Демон-задача
ex.spawn(async {
    loop {
        println!("I'm a daemon task looping forever.");
        Timer::after(Duration::from_secs(1)).await;
    }
})
.detach();
}

Грациозная отмена

#![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; // Грациозная отмена
});
}

Реализации трейтов

Основные трейты

ТрейтРеализацияНазначение
Futureimpl<T, M> Future for Task<T, M>Ожидание результата задачи
Debugimpl<T, M> Debug for Task<T, M>Отладочное представление
Dropimpl<T, M> Drop for Task<T, M>Автоматическая отмена при удалении

Маркерные трейты

ТрейтУсловияНазначение
SendT: Send, M: Send + SyncПередача между потоками
SyncM: Send + SyncРазделение между потоками
UnpinВсегдаМожно перемещать после закрепления
UnwindSafeВсегдаБезопасность при панике
RefUnwindSafeВсегдаБезопасность ссылок при панике
FreezeВсегдаМожет быть заморожено

Типы и зависимости

Параметры типа

ПараметрОграниченияНазначение
TЛюбой типРезультат выполнения задачи
MПо умолчанию ()Метаданные задачи

Связанные типы

ТипНазначение
FallibleTask<T, M>Задача с обработкой отмены
Output = TТип результата для Future

Поведение при удалении

ДействиеРезультатАльтернатива
drop(task)Немедленная отменаtask.detach()
task.cancel().awaitГрациозная отмена-
task.detach()Продолжение выполнения-

Особенности многопоточности

  • is_finished() может изменить состояние сразу после вызова
  • Отмена задачи пробуждает ее для последнего выполнения
  • Исполнитель может уничтожить задачу через Runnable

Таблица сравнения методов отмены

МетодТипВозвращаетПоведение
drop()Синхронный-Немедленная отмена
cancel().awaitАсинхронныйOption<T>Грациозная отмена
detach()Синхронный-Без отмены

Трейты Future

Реализация Future

МетодСигнатураНазначение
pollfn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<T>Опрос готовности результата
Outputtype Output = TТип выходного значения

Безопасность

  • Send: Только если T: Send и M: Send + Sync
  • Sync: Только если M: Send + Sync
  • UnwindSafe: Всегда безопасно для размотки
  • Panic Safety: Отмена безопасна при панике