Wiki
猫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; лучше делегируй ее в обычные сервисы приложения.
Что читать дальше
Navigation
Start here
Runtime and Architecture
- Bot-Lifecycle
- Webhook-Runtime
- Middleware
- Runners
- Error-Handling
- Logging
- Update-Routing-Model
- Policies
- Scenes
Interaction and Telegram API
- Inline-Keyboards-and-Payloads
- Auto-Generated-Commands
- Drafts
- Rich-Messages
- Localization
- Rate-Limiting
- tgapi-Overview