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

Структура LocalExecutor - Сводная таблица методов

Источник: Документация async-executor::LocalExecutor

  1. Только один поток - нельзя передавать между потоками
  2. Нет Send - задачи не должны быть Send
  3. Локальное время жизни - привязан к области видимости
  4. Блокирующие итераторы - могут заблокировать исполнитель

Сравнение с Executor

ХарактеристикаLocalExecutorExecutor
Многопоточность❌ Только один поток✅ Многопоточный
Требование Send❌ Не требуется✅ Обязательно
Производительность✅ Выше для локальных задач✅ Лучше для CPU-bound
Безопасность✅ Нет гонок данных✅ Синхронизированный

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

МетодСигнатураВозвращаемый типОписаниеОсобенности
newpub const fn new() -> LocalExecutor<'a>LocalExecutor<'a>Создает однопоточный исполнительТолько для текущего потока
is_emptypub fn is_empty(&self) -> boolboolПроверяет отсутствие незавершенных задачtrue если задач нет
spawnpub fn spawn<T>(future: impl Future<Output = T> + 'a) -> Task<T>Task<T>Запускает задачу в исполнителеНе требует Send
spawn_manypub fn spawn_many<T, F>(futures: impl IntoIterator<Item = F>, handles: &mut impl Extend<Task<F::Output>>)()Массовый запуск задачУлучшает производительность
try_tickpub fn try_tick(&self) -> boolboolПытается выполнить одну задачуНеблокирующий
tickpub async fn tick(&self)()Выполняет одну задачуБлокирует если задач нет
runpub async fn run<T>(future: impl Future<Output = T>) -> TTЗапускает исполнитель до завершения фьючерсаОсновной метод выполнения

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

Конструкторы

МетодОсобенностиПример использования
newСоздает локальный исполнитель для текущего потокаlet ex = LocalExecutor::new();
defaultЧерез трейт Default (аналогично new)let ex = LocalExecutor::default();

Управление задачами

МетодНазначениеОтличие от Executor
spawnЗапуск одной задачиНе требует Send
spawn_manyПакетный запуск задачБлокировка не снимается (нет других потоков)
is_emptyПроверка состоянияАналогично Executor

Выполнение

МетодТип выполненияПрименение
try_tickНеблокирующийДля фонового выполнения
tickАсинхронныйДля кооперативной многозадачности
runБлокирующийОсновной цикл выполнения

Требования к типам

Для задач

ПараметрТребованиеОбоснование
T'aВремя жизни задачи
FFuture<Output = T> + 'aЛокальный фьючерс
ОтсутствуетSendТолько один поток

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

Стандартные трейты

ТрейтНазначениеОсобенности
DebugОтладочный выводФорматирование
DefaultЗначение по умолчаниюАналогично new()

Маркерные трейты (отличия от Executor)

ТрейтРеализацияОбоснование
!SendНе реализованТолько для текущего потока
!SyncНе реализованНельзя разделять между потоками
UnwindSafeРеализованБезопасность при панике
RefUnwindSafeРеализованБезопасность ссылок при панике

Автоматические реализации

ТрейтСтатусПримечание
UnpinРеализованМожно перемещать
!FreezeНе замораживается-

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

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

#![allow(unused)]
fn main() {
use async_executor::LocalExecutor;
use futures_lite::future;

let local_ex = LocalExecutor::new();

future::block_on(local_ex.run(async {
    println!("Hello world!");
}));
}

Запуск задач

#![allow(unused)]
fn main() {
let ex = LocalExecutor::new();

// Одиночная задача
let task = ex.spawn(async { 1 + 2 });

// Массовый запуск
let mut tasks = vec![];
ex.spawn_many([async { 1 }, async { 2 }], &mut tasks);
}