Источник: Документация async-executor::LocalExecutor
- Только один поток - нельзя передавать между потоками
- Нет Send - задачи не должны быть Send
- Локальное время жизни - привязан к области видимости
- Блокирующие итераторы - могут заблокировать исполнитель
| Характеристика | LocalExecutor | Executor |
| Многопоточность | ❌ Только один поток | ✅ Многопоточный |
| Требование Send | ❌ Не требуется | ✅ Обязательно |
| Производительность | ✅ Выше для локальных задач | ✅ Лучше для CPU-bound |
| Безопасность | ✅ Нет гонок данных | ✅ Синхронизированный |
| Метод | Сигнатура | Возвращаемый тип | Описание | Особенности |
new | pub const fn new() -> LocalExecutor<'a> | LocalExecutor<'a> | Создает однопоточный исполнитель | Только для текущего потока |
is_empty | pub fn is_empty(&self) -> bool | bool | Проверяет отсутствие незавершенных задач | true если задач нет |
spawn | pub fn spawn<T>(future: impl Future<Output = T> + 'a) -> Task<T> | Task<T> | Запускает задачу в исполнителе | Не требует Send |
spawn_many | pub fn spawn_many<T, F>(futures: impl IntoIterator<Item = F>, handles: &mut impl Extend<Task<F::Output>>) | () | Массовый запуск задач | Улучшает производительность |
try_tick | pub fn try_tick(&self) -> bool | bool | Пытается выполнить одну задачу | Неблокирующий |
tick | pub async fn tick(&self) | () | Выполняет одну задачу | Блокирует если задач нет |
run | pub async fn run<T>(future: impl Future<Output = T>) -> T | T | Запускает исполнитель до завершения фьючерса | Основной метод выполнения |
| Метод | Особенности | Пример использования |
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 | Время жизни задачи |
F | Future<Output = T> + 'a | Локальный фьючерс |
| Отсутствует | Send | Только один поток |
| Трейт | Назначение | Особенности |
Debug | Отладочный вывод | Форматирование |
Default | Значение по умолчанию | Аналогично new() |
| Трейт | Реализация | Обоснование |
!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);
}