1.0.3 • Published 11 months ago

taskman-lib v1.0.3

Weekly downloads
-
License
ISC
Repository
-
Last release
11 months ago

Taskman-lib

Taskman-lib — это библиотека, которая представляет собой мощный планировщик задач, который эффективно обрабатывает как обычные функции, так и функции-генераторы, позволяя выполнять задачи в основном потоке и в веб-воркерах. Этот планировщик обеспечивает оптимальную производительность, управляя выполнением задач на основе приоритетов и доступных ресурсов. Также можно запускать задачи отложенно.

Рекомендуется запускать задачу в воркере, если функция большая и её выполнение может занять много времени, чтобы не блокировать главный поток. Также в воркере нельзя запускать функции-генераторы.

Возможности

  • Поддержка обычных функций и функций-генераторов: Легко обрабатывайте различные типы задач с бесшовной интеграцией.
  • Выполнение в основном потоке: Приоритизируйте и выполняйте задачи с помощью requestIdleCallback, чтобы браузер оставался отзывчивым.
  • Интеграция с веб-воркерами: Переносите задачи в веб-воркеры для параллельной обработки с распределением задач на основе количества доступных потоков процессора.

Принцип работы

Типы задач

  1. Обычные функции
  2. Функции-генераторы

Типы выполнения

  1. Выполнение в основном потоке: Задачи выполняются напрямую в основном потоке, обеспечивая низкую задержку выполнения.
  2. Выполнение в веб-воркерах: Задачи передаются на выполнение в веб-воркеры для параллельной обработки, что идеально подходит для задач, требующих больших вычислительных ресурсов.

Оборачивание задач в 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, чтобы можно было прокидывать аргументы для функции в воркер

1.0.3

11 months ago

1.0.2

11 months ago

1.0.1

11 months ago

1.0.0

11 months ago