Использование celery beat в качестве планировщика для нерегулярных интервалов?

У меня есть одно приложение django, которое позволяет пользователю создавать несколько разных блогов. Каждый блог должен собирать модельные данные (например, количество посещений, кликов и т. д.) ежечасно/ежедневно/еженедельно и т. д., а интервал сбора данных может различаться в зависимости от блога. Кроме того, в какой-то момент пользователи могут захотеть изменить частоту сбора данных, например. от еженедельного до ежедневного в пользовательском интерфейсе.

Глядя на Периодические задачи из официальной документации, кажется, что Мне пришлось бы «жестко закодировать» значения интервала в файле настроек, и я могу указать интервал только один раз, например.

from celery.schedules import crontab

CELERYBEAT_SCHEDULE = {
    # Executes every Monday morning at 7:30 A.M
    'add-every-monday-morning': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

Как мне это сделать, или сельдерей вообще может планировать несколько задач одного типа с разными интервалами И изменять значения через пользовательский интерфейс (через AJAX)?


person FatHippo    schedule 02.11.2016    source источник
comment
с django-celery вы можете использовать djcelery.schedulers.DatabaseScheduler, которые позволяют вам управлять вашими периодическими задачами в админке django. документы по сельдерею   -  person devxplorer    schedule 02.11.2016
comment
Вау changing the frequency of data collection круто. Я напишу эту функцию на github.com/rajasimon/beatserver.   -  person Raja Simon    schedule 02.11.2016
comment
@devxplorer Я пробую django-celery-beat, который, похоже, заменяет django-celery (пожалуйста, дайте мне знать, если это дело не в этом). Проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, что когда я добавляю новые PeriodicTasks, они не выполняются, пока я не перезапущу процесс битов (celery -A proj beat -l info -S django).   -  person FatHippo    schedule 14.11.2016
comment
Все должно работать без перезагрузки. Но если вы массово обновляете периодические задачи, вам нужно будет обновить счетчик вручную: PeriodicTasks.changed(), из документы   -  person devxplorer    schedule 14.11.2016


Ответы (1)


Как отметил @devxplorer, django-celery предоставляет серверную часть базы данных. Вы можете использовать это для управления задачами через администратора Django, программно, или выставить модель через API.

from djcelery.models import PeriodicTask

PeriodicTask(
    name="My First Task",
    ...
).create()
all_tasks = PeriodicTask.objects.all()
...

Затем запустите процесс бита с помощью

$ celery -A proj beat -S djcelery.schedulers.DatabaseScheduler
person pnovotnak    schedule 02.11.2016
comment
Я заметил, что когда я создаю периодические задачи после запуска процесса битов, новые задачи не запускаются, пока я не перезапущу процесс битов. Как автоматически перезапустить процесс ритма при создании новой периодической задачи? - person FatHippo; 14.11.2016
comment
@FatHippo, вы могли бы добавить внешний наблюдатель за файлами - последнее, что я слышал, флаг --autoreload был плохим juju. Я попытался использовать его один раз и оказался в кроличьей норе на 3 дня, потому что он ломал вещи очень тонко. Я думаю, что это было удалено в последней версии; docs.celeryproject.org/ ru/последние/ - person pnovotnak; 14.11.2016