Я использую Django
, Celery
, RabbitMQ
и postgreSQL
.
Я делаю именно то, что вы хотите.
PIP: celery
и flower
Вам нужен файл конфигурации Celery (в папке settings.py
):
То, что вы хотите добавить, это beat_schedule
:
app.conf.beat_schedule = {
'task-name': {
'task': 'myapp.tasks.task_name',
'schedule': crontab(minute=30, hour=5, day_of_week='mon-fri'),
},
}
Это добавит запись в вашу базу данных для выполнения task_name
(с понедельника по пятницу в 5:30), которую вы можете изменить непосредственно в настройках (перезагрузите celery
и celery beat
после)
Что мне нравится, так это то, что вы можете легко добавить механизм повтора с безопасностью:
@app.task(bind=True, max_retries=50)
def task_name(self, entry_pk):
entry = Entry.objects.get(pk=entry_pk)
try:
entry.method()
except ValueError as e:
raise self.retry(exc=e, countdown=5 * 60, queue="punctual_queue")
Когда мой method()
рейз ValueError
, я повторно выполню этот метод через 5 минут с максимальным числом 50 попыток.
Хорошая часть - у вас есть доступ к базе данных в админке Django:
И вы можете проверить с помощью flower
, выполнена ли задача или нет (с отслеживанием):
У меня ежедневно выполняется более 1000 задач, вам нужно создать очереди и работника.
Для этого я использую 10 рабочих (для будущих отвратительных целей):
celery multi start 10 -A MYAPP -Q:1-3 recurring_queue,punctual_queue -Q:4,5 punctual_queue -Q recurring_queue --pidfile="%n.pid"
И демон, запускающий задачу:
celery -A MYAPP beat -S django --detach
Возможно, это излишне для вас, но он может сделать для вас гораздо больше:
- отправка электронной почты асинхронно (если она не удалась, вы можете исправить и повторно отправить письмо)
- загрузить и постобработать асинхронные для пользователя
- Каждое задание, которое требует времени, но вы не хотите ждать (вы можете связать задание, которое нужно завершить, вернуть результат и использовать его в другом задании)