Timer¶
Существует встроенный дополнительный компонент (A)syncTimer, предназначенный
для периодического запуска задач QTasks. Таймер интегрируется напрямую с QueueTasks
через параметр app и работает с задачами как с расписанием, а
не с единичными вызовами.
(A)syncTimer позволяет выносить логику планирования из бизнес-кода и использовать декларативные триггеры для запуска задач по времени.
Принцип работы¶
Timer является отдельным компонентом, который:
- регистрирует периодические задачи;
- использует внешние триггеры (например, cron);
- инициирует выполнение задач через стандартный механизм QTasks;
- не изменяет логику самих задач.
Задача, запускаемая через Timer, остаётся обычной задачей QTasks и может быть вызвана вручную, через API или другими компонентами.
Пример использования¶
from qtasks.timers import AsyncTimer
from apscheduler.triggers.cron import CronTrigger
timer = AsyncTimer(app=app)
timer.add_task(
"daily_report",
trigger=CronTrigger(hour=23, minute=59),
)
@app.task(name="daily_report")
async def daily_report():
stats = await db.get_today_stats()
await mailer.send(
"owner@shop.com",
"Ежедневный отчёт",
stats.format(),
)
В данном примере задача daily_report будет автоматически запускаться каждый день
в 23:59.
Под капотом¶
Работа Timer состоит из следующих этапов:
- Timer инициализируется с экземпляром
QueueTasks. -
При вызове
add_task: -
сохраняется имя задачи;
- регистрируется триггер запуска;
- формируется связка «триггер → задача».
-
При срабатывании триггера:
-
Timer создаёт обычный вызов задачи через
add_task; - задача попадает в Broker и обрабатывается Worker как стандартная.
Таким образом, Timer не выполняет задачу напрямую и не обходит очередь.
Триггеры¶
(A)syncTimer не ограничивает тип триггера. На практике чаще всего используются
триггеры из apscheduler, например:
CronTrigger— cron-расписание;IntervalTrigger— запуск с фиксированным интервалом;DateTrigger— однократный запуск в заданное время.
Это позволяет гибко управлять расписанием без изменения кода задач.
Особенности¶
- Timer является дополнительным компонентом и не обязателен для работы QTasks.
- Таймер работает с задачами по имени, а не по ссылке на функцию.
- Задачи, зарегистрированные в Timer, полностью совместимы с retry, priority, middlewares и плагинами.
- Timer не хранит состояние выполнения задач — этим занимается стандартное хранилище QTasks.
Итог¶
(A)syncTimer предоставляет:
- декларативное планирование задач;
- интеграцию с внешними системами расписаний;
- единый механизм запуска задач через очередь;
- чистое разделение бизнес-логики и логики планирования.
Страница оформлена как холст и может быть использована как шаблон для документации других дополнительных компонентов QTasks.