Забудьте о костылях в планировании задач с FastScheduler

15 фев 2026

Репозиторий давно не обновлялся

Последнее обновление было 8 месяцев назад.

440
19
4
8 месяцев

Знакомая ситуация: вам нужно добавить в Python-проект пару фоновых задач. Например, раз в час чистить кэш или каждое утро отправлять отчет в Telegram. Вы начинаете выбирать инструмент. Celery? Слишком громоздко, нужен Redis или RabbitMQ. APScheduler? Мощно, но API кажется перегруженным, а встроенного мониторинга не хватает. В итоге вы либо пишете свой цикл с while True и time.sleep(), либо тратите полдня на настройку тяжеловесного комбайна.

Недавно я наткнулся на FastScheduler — проект, который закрывает ту самую «серую зону» между простыми скриптами и сложными распределенными системами. Это легкий планировщик с человеческим лицом, поддержкой асинхронности и — что самое приятное — встроенным дашбордом.

Что это такое и почему стоит обратить внимание

FastScheduler — это библиотека для Python 3.10+, которая ставит во главу угла простоту использования. Основная идея в том, чтобы превратить любую функцию в задачу с помощью одного декоратора. При этом под капотом скрываются взрослые возможности: работа с часовыми поясами, сохранение состояния между перезапусками и автоматические повторы при ошибках.

FastScheduler Demo

Кому это пригодится? В первую очередь разработчикам микросервисов на FastAPI, создателям ботов и всем, кому нужно надежное выполнение задач по расписанию без развертывания сложной инфраструктуры.

Реклама

Пять фишек, которые делают жизнь проще

1. Декораторы, которые говорят сами за себя

Забудьте о конфигах. Хотите запускать задачу каждые 10 секунд? Пожалуйста. Нужно в 9 утра по понедельникам? Проще простого.

@scheduler.every(10).seconds
def simple_task():
    print("Прошло еще 10 секунд")

@scheduler.weekly.monday.at("09:00")
async def monday_report():
    print("Пора приниматься за работу!")

Такой синтаксис не просто экономит время, он делает код самодокументированным. Даже человек, далекий от проекта, сразу поймет, когда выполняется этот код.

2. Полная поддержка Asyncio

В 2024 году странно видеть библиотеки без нативной поддержки async/await. FastScheduler отлично дружит с асинхронными функциями. Это критично, если ваши задачи связаны с сетевыми запросами или базами данных — планировщик не будет блокировать основной поток выполнения.

3. Дашборд из коробки

Это, пожалуй, киллер-фича. Если вы интегрируете FastScheduler в FastAPI, вы получаете полноценный UI для мониторинга.

FastScheduler Dashboard

В реальном времени можно увидеть:

  • Статус каждой задачи (активна, на паузе, выполняется).
  • Таймер обратного отсчета до следующего запуска.
  • Историю последних пяти выполнений.
  • Кнопки для мгновенного запуска или остановки задачи.

4. Живучесть и персистентность

Часто самописные планировщики страдают от «амнезии»: если сервер перезагрузился, информация о пропущенных задачах теряется. FastScheduler умеет сохранять свое состояние. По умолчанию он использует JSON-файл, но для серьезных нагрузок можно подключить PostgreSQL, MySQL или SQLite через SQLModel.

Если задача должна была выполниться, пока сервер лежал, планировщик «догонит» расписание при старте (если вы не запретили это явно через .no_catch_up()).

5. Очередь «мертвых писем» (Dead Letter Queue)

Если задача упала с ошибкой, она не просто исчезает в логах. FastScheduler сохраняет подробности падения в отдельную очередь. Вы можете зайти в дашборд, посмотреть Traceback, понять причину и перезапустить задачу вручную. Для отладки в продакшене — вещь незаменимая.

Техническая начинка

Интересно, как автор подошел к архитектуре. Вместо того чтобы изобретать велосипед, FastScheduler предлагает модульность. Вы устанавливаете только то, что нужно:

  • pip install fastscheduler[fastapi] — если нужен дашборд.
  • pip install fastscheduler[cron] — если нужны сложные Cron-выражения.
  • pip install fastscheduler[database] — если нужна БД для хранения состояния.

Внутри используется многопоточность для изоляции задач (параметр max_workers позволяет ограничить количество одновременно выполняемых джоб), что защищает систему от перегрузки.

Практический пример: интеграция с FastAPI

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

from fastapi import FastAPI
from fastscheduler import FastScheduler
from fastscheduler.fastapi_integration import create_scheduler_routes

app = FastAPI()
scheduler = FastScheduler(storage="sqlmodel", database_url="sqlite:///jobs.db")

# Подключаем дашборд по адресу /scheduler/
app.include_router(create_scheduler_routes(scheduler))

@scheduler.every(1).hours.retries(3).timeout(300)
async def hourly_cleanup():
    # Эта задача будет пробовать перезапуститься 3 раза при ошибке
    # и принудительно завершится через 5 минут
    print("Чистим временные файлы...")

@app.on_event("startup")
def start_scheduler():
    scheduler.start()

Всего несколько строк, и у вас есть надежная система с БД-бэкендом, автоматическими ретраями и визуальным контролем.

Итоги: стоит ли пробовать?

В моей практике часто встречались проекты, где Celery был избыточен, а стандартный cron в Linux неудобен из-за отсутствия гибкого управления из кода. FastScheduler идеально заполняет эту нишу.

Плюсы:

  • Порог вхождения практически нулевой.
  • Шикарный визуальный интерфейс.
  • Гибкая настройка (тайм-ауты, ретраи, часовые пояса).
  • Поддержка современных стандартов Python.

Минусы:

  • Проект еще молодой, поэтому для критически важных систем с тысячами задач в секунду стоит проводить тщательное тестирование.

Если вы ищете способ навести порядок в фоновых задачах своего приложения и хотите видеть, что происходит «под капотом» без копания в логах — дайте FastScheduler шанс. По крайней мере, его декораторы точно сделают ваш код чище.

Кстати, автор активно принимает идеи и PR, так что это отличная возможность поучаствовать в развитии полезного инструмента. Ссылка на репозиторий: MichielMe/fastscheduler.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.