releaser.scheduler - фреймворк для выполнения задач по расписанию

Зачем понадобился свой аналог cron: кажется, так лучше/проще описывать поведение, которое регулярно запускается из crond.
Фреймворк management/commands более многословный, crontab для него нужно писать вручную.

"Задача" == функция, снабженная декоратором @task; аргументов ей не передается, возвращаемое значение игнорируется
Параметры декоратора: расписание (как для cron) + необязательный тег
Задачи ищутся в файлах tasks.py во всех установленных приложениях releaser.*

Фреймворк берет на себя:
  запускать задачи по указанным расписаниям
  задачи с одинаковым тегом запускать в одном процессе последовательно (порядок не гарантируется)
  проверять, что у задач с одним launch_tag расписание одно и то же
  если одна из задач в рамках процесса заканчивается исключением, другие задачи все равно будут запущены
  задачи с разными тегами или без тегов запускать в отдельных процессах
  брать блокировки, чтобы два экземпляра одной задачи не работали одновременно

Фреймворк не оборачивает код в транзакцию, для этого можно использовать django.db.transaction.atomic:
https://docs.djangoproject.com/en/1.8/topics/db/transactions/#django.db.transaction.atomic

Как работает: при сборке пакетов просматриваются все tasks.py и генерируются кронтабы с правильной группировкой задач


Пример описания задачи:

from releaser.scheduler.tasks_base import task

@task(schedule='* * * * *', launch_tag='foobar')
def example_task():
    # здесь код, который делает, что нужно
    print 'example_task'

(конец примера)


Чтобы создать новую задачу:

1. выбрать приложение, в котором эта задача будет

2. в каталоге приложения создать файл tasks.py, если его ещё нет

3. в этом файле добавить код как в примере, а потом заменить в нём:
   * название процедуры: должно быть уникальным в пределах Табулы
   * расписание
   * тэг запуска (launch_tag) - если непонятно, какой нужен, можно убрать
   * тело процедуры на код, который так регулярно нужно запускать


См. также: releaser/subscriptions/README - на момент написания задачи были про отслеживание новостей и отправку
уведомлений, про уведомления можно почитать там.
