taskman-lib
v1.0.3
Published
A library for adding tasks to be completed with a given priority.
Downloads
14
Maintainers
Readme
Taskman-lib
Taskman-lib — это библиотека, которая представляет собой мощный планировщик задач, который эффективно обрабатывает как обычные функции, так и функции-генераторы, позволяя выполнять задачи в основном потоке и в веб-воркерах. Этот планировщик обеспечивает оптимальную производительность, управляя выполнением задач на основе приоритетов и доступных ресурсов. Также можно запускать задачи отложенно.
Рекомендуется запускать задачу в воркере, если функция большая и её выполнение может занять много времени, чтобы не блокировать главный поток. Также в воркере нельзя запускать функции-генераторы.
Возможности
- Поддержка обычных функций и функций-генераторов: Легко обрабатывайте различные типы задач с бесшовной интеграцией.
- Выполнение в основном потоке: Приоритизируйте и выполняйте задачи с помощью
requestIdleCallback
, чтобы браузер оставался отзывчивым. - Интеграция с веб-воркерами: Переносите задачи в веб-воркеры для параллельной обработки с распределением задач на основе количества доступных потоков процессора.
Принцип работы
Типы задач
- Обычные функции
- Функции-генераторы
Типы выполнения
- Выполнение в основном потоке: Задачи выполняются напрямую в основном потоке, обеспечивая низкую задержку выполнения.
- Выполнение в веб-воркерах: Задачи передаются на выполнение в веб-воркеры для параллельной обработки, что идеально подходит для задач, требующих больших вычислительных ресурсов.
Оборачивание задач в Promises
Все задачи, независимо от того, выполняются ли они в основном потоке или в веб-воркерах, оборачиваются в Promises, обеспечивая асинхронное и неблокирующее выполнение.
Выполнение в основном потоке
- Очередь с приоритетом: Для управления приоритетом задач используется бинарная куча. Задачи добавляются в очередь на основе их уровня приоритета и времени добавления в очередь, чтобы сортировка оставалась устойчивой.
- Обычные функции: Напрямую добавляются в очередь с приоритетом.
- Функции-генераторы: Итератор, полученный из генератора, добавляется в очередь.
- Обработка задач: Когда в очереди есть задачи, они выполняются в свободное время браузера с помощью
requestIdleCallback
.- Обычные функции: Выполняются немедленно.
- Итераторы: Обрабатываются по одной итерации за раз, и итератор заново помещается в очередь, если остаются другие итерации.
Выполнение в веб-воркерах
- Неограниченное создание веб-воркеров: Хотя веб-воркеры можно создавать в неограниченном количестве, одновременно может работать только столько, сколько потоков в процессоре (ограничение библиотеки -
navigator.hardwareConcurrency || 16
).- Ограничения браузеров: Большинство браузеров накладывают ограничение на одновременную работу около 20 веб-воркеров.
- Очередь с приоритетом для веб-воркеров: Отдельная очередь с приоритетом управляет задачами, предназначенными для веб-воркеров.
- Инициализация пула веб-воркеров: Пул воркеров инициализируется с числом веб-воркеров, равным
navigator.hardwareConcurrency
или значением по умолчанию 16. - Распределение задач: Задачи отправляются в доступные веб-воркеры сразу после поступления в очередь. Как только воркер завершает задачу, он немедленно получает следующую задачу из очереди, если есть ожидающие задачи.
- Инициализация пула веб-воркеров: Пул воркеров инициализируется с числом веб-воркеров, равным
Установка
Для установки Taskman-lib используйте npm:
npm install taskman-lib
yarn add taskman-lib
Класс TaskManager
TaskManager
— это класс, с помощью которого можно добавлять функции-задачи на выполнение.
Пример использования
import { TaskManager, TaskPriority } from "multitasking-lib";
const tm = new TaskManager();
const task1 = addTask({
worker: true,
priority: TaskPriority.HIGH,
delay: 1000,
task: () => {
/* ... */
},
});
task1.then((result) => {
console.log(1);
});
const task2 = addTask({
task: () => {
/* ... */
},
});
task2.then((result) => {
console.log(2);
});
Конструктор
new TaskManager()
Описание: Создает новый экземпляр класса MyClass
.
Методы
addTask(options)
Описание: Добавляет задачу в очередь и запускает её если поток освободился.
Параметры:
options
(тип:Object
): Объект с параметрами для настройки класса.worker
(тип:boolean
, по умолчанию:false
): признак выполнения задачи в веб воркере.priority
(тип:TaskPriority
, по умолчанию:TaskPriority.DEFAULT
): приоритет задачи.delay
(тип:number
, по умолчанию:0
): тайм-аут (время в мс, после которого запускается задача).task
(тип:Function
илиGeneratorFunction
, обязательный): задача (функция или генератор).
Возвращает:
Promise
: Результат возвращаемый функцией-задачей или ошибку.
Дополнительная информация
Примечания: если поле
worker
=true
, то полеtask
должно являться чистой функцией без аргументов и без каррирования, потому что мы её приводим к строке.Планы на будущее: добавить поле arguments, чтобы можно было прокидывать аргументы для функции в воркер