Внутренний планировщик задач

Mind.js — это библиотека для создания и управления асинхронными задачами и обработкой данных в JavaScript. В основе её работы лежит концепция внутреннего планировщика задач, который обеспечивает эффективное выполнение функций, управление очередями и приоритетами.

Архитектура планировщика

Планировщик Mind.js основан на цикле событий, напоминающем механизм Event Loop в JavaScript, но дополнительно включает собственные структуры данных для:

  • Управления приоритетами задач.
  • Планирования повторяющихся и отложенных функций.
  • Контроля за потреблением ресурсов.

Основные компоненты:

  1. Task Queue — очередь задач, где каждая задача представлена объектом с информацией о функции, параметрах, приоритете и статусе выполнения.
  2. Scheduler Engine — движок планировщика, который обрабатывает задачи по приоритету и времени запуска.
  3. Task Runner — исполнитель задач, обеспечивающий асинхронное и последовательное выполнение с контролем ошибок и возможностью отмены.

Типы задач

Mind.js поддерживает несколько типов задач:

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

Создание и регистрация задач

Задача в Mind.js создаётся через объект Task, который принимает следующие параметры:

  • fn — функция, которая будет выполнена.
  • args — массив аргументов для функции.
  • priority — числовой приоритет задачи (чем выше, тем раньше выполняется).
  • delay — задержка перед выполнением (в миллисекундах).
  • repeat — число повторений (0 — без повторений, Infinity — бесконечно).

Пример структуры задачи:

const task = new Task({
    fn: processData,
    args: [data],
    priority: 10,
    delay: 500,
    repeat: 3
});

Добавление задач в планировщик

После создания задача помещается в планировщик методом schedule(task). Планировщик автоматически определяет, когда и в каком порядке её выполнять.

scheduler.schedule(task);

Для повторяющихся задач движок отслеживает оставшееся количество повторений и интервал между ними.

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

Приоритеты позволяют контролировать порядок выполнения задач. Mind.js использует мин-кучу (min-heap) для хранения задач с учётом приоритета, что обеспечивает быстрый доступ к самой важной задаче.

Ключевые правила:

  • Задачи с более высоким числовым значением priority выполняются раньше.
  • Задачи с одинаковым приоритетом выполняются в порядке добавления в очередь.
  • Приоритет может быть изменён динамически во время выполнения.
task.priority = 20; // повысить приоритет задачи
scheduler.reschedule(task); // обновить очередь

Асинхронное выполнение

Mind.js поддерживает выполнение задач в асинхронном режиме через промисы и колбэки. Планировщик автоматически обрабатывает:

  • Ожидание завершения промиса.
  • Обработку ошибок с возможностью повторной попытки.
  • Прерывание задачи при необходимости.
const asyncTask = new Task({
    fn: asyncProcess,
    args: [input],
    priority: 15
});
scheduler.schedule(asyncTask);

Если функция возвращает промис, планировщик ожидает его завершения и корректно обновляет статус задачи (pending, running, completed, failed).

Повторение и отложенные задачи

Повторяющиеся задачи реализуются через внутренние таймеры. Планировщик Mind.js хранит временные метки следующего запуска и проверяет их на каждом цикле. Это обеспечивает точность запуска и предотвращает накопление задержек.

const repeatedTask = new Task({
    fn: syncData,
    args: [],
    repeat: Infinity,
    delay: 1000
});
scheduler.schedule(repeatedTask);

Отмена и управление задачами

Любая задача может быть отменена через метод cancel(). Отмена учитывает, выполняется ли задача в данный момент, и корректно освобождает ресурсы.

task.cancel(); // удаляет задачу из очереди

Дополнительно планировщик предоставляет инструменты для:

  • Очистки всей очереди.
  • Фильтрации задач по статусу или приоритету.
  • Паузы и возобновления работы планировщика.

Оптимизация производительности

Mind.js минимизирует нагрузку на Event Loop:

  • Объединяет мелкие задачи в один цикл.
  • Использует эффективные структуры данных для очередей.
  • Позволяет задавать лимит одновременно выполняемых задач.
scheduler.setConcurrency(5); // не более 5 задач одновременно

Логирование и мониторинг

Каждая задача имеет свойство логирования, которое позволяет отслеживать:

  • Время запуска и завершения.
  • Ошибки и повторные попытки.
  • Количество оставшихся повторений.
console.log(task.log);

Логи помогают диагностировать узкие места и оптимизировать планирование.

Взаимодействие с другими модулями

Планировщик Mind.js легко интегрируется с внешними системами:

  • API для получения данных с удалённых серверов.
  • Обработка событий в реальном времени.
  • Управление очередями сообщений.

Использование планировщика в сочетании с другими модулями позволяет строить многопоточную логику на уровне событий, сохраняя простоту асинхронного программирования.