REPOSITORY / ScuroNeko/Laniakea

Wiki

KNOWLEDGE REPOSITORY
4
Runners RU
ScuroNeko edited this page 2026-05-20 13:19:27 +03:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Runners RU

English version: Runners

Это краткая русскоязычная версия страницы про фоновые задачи. Полная и наиболее актуальная страница: Runners.

Что такое runner

Runner — это фоновая или одноразовая задача, которая живет рядом с механизмом выполнения бота, но не относится к конкретному обработчику обновлений.

Типичные сценарии:

  • задачи очистки;
  • служебные задачи обслуживания;
  • health checks;
  • подготовка при запуске.

Как создается runner

Основной конструктор:

runner := laniakea.NewRunner("cleanup", fn)

Методы builder:

  • Every(time.Duration) — интервал повторного запуска. Ноль (по умолчанию) означает одноразовый запуск; положительное значение — периодический.
  • Async(bool) — если true (по умолчанию), запускается в goroutine; если false, блокирует запуск runtime.

Основные режимы

Одноразовый async (по умолчанию)

runner := laniakea.NewRunner("prefetch", fn)
  • выполняется один раз;
  • стартует в goroutine;
  • не блокирует запуск.

Одноразовый sync

runner := laniakea.NewRunner("warmup", fn).Async(false)
  • выполняется один раз;
  • блокирует запуск до завершения;
  • полезен для работы, критичной на старте.

Повторяющийся async

runner := laniakea.NewRunner("cleanup", fn).Every(time.Minute)
  • работает циклически с заданным интервалом;
  • использует ticker;
  • живет до ctx.Done().

Невалидная конфигурация

Повторяющийся synchronous runner (Every(d > 0).Async(false)) считается невалидным и пропускается с предупреждением — блокировать запуск бесконечно никогда не имеет смысла.

Когда стартуют фоновые задачи

Фоновые задачи стартуют из RunWithContext(...) или RunWebhookWithContext(...), а не из NewBot(...).

Это часть фазы выполнения, а не фазы сборки конфигурации.

Обработка ошибок

Если runner возвращает ошибку:

  • бот логирует предупреждение;
  • через observer отправляется ErrorEvent;
  • бот продолжает работу.

Семантика остановки

При корректной остановке бот:

  • ждет одноразовые асинхронные задачи;
  • ждет завершения фоновых задач после того, как они заметят ctx.Done().

Поэтому код runner должен завершаться достаточно быстро.

Практические примеры

Периодическая очистка

cleanup := laniakea.NewRunner("cleanup", func(bot *laniakea.Bot[*App]) error {
	return bot.GetAppData().CleanupExpired()
}).Every(5 * time.Minute)

Блокирующий запуск при старте

warmup := laniakea.NewRunner("warmup", func(bot *laniakea.Bot[*App]) error {
	return bot.GetAppData().WarmCaches()
}).Async(false)

Рекомендации

  • Для периодических задач используй повторяющийся async runner с Every(...).
  • Для критичной стартовой работы используй одноразовый sync runner.
  • Не держи сложную бизнес-логику внутри runner; лучше делегируй ее в обычные сервисы приложения.

Что читать дальше