Django celery выполняет некоторое задание дважды
1. Вопрос 1. Некоторые задания выполняются дважды
логика задачи
settings.CELERYBEAT_SCHEDULE crontab->create_course_reports->create_course_report_pdf.apply_async (inside for-loop call multiple tasks)-> email/save pdf
проблемы (журнал сельдерея ниже)
- f6cf7468-bec3-466c-877e-89d9064472b0 задание: выполнено 1 раз. нет проблем
- 8812805b-65aa-4d28-8f71-490a655a1672 задание: выполнено 2 раза. получено 1 -> получено 2 -> выполняется 1 -> выполняется 2
- c1931609-69c1-43c0-934c-97264f9afa82 задание: выполнено 2 раза. получил 1 -> выполнил 1 -> получил 2 -> выполнил 2
settings.CELERYBEAT_SCHEDULE
{
...
# create report
"create-course-reports": {
"task": "hrd.emonitoring.tasks.create_course_reports",
"schedule": crontab(hour="7", minute="0"),
},
...
}
- create_course_reports
@shared_task(bind=True)
def create_course_reports(self):
......
......
# create report
for _, course_id, email_time in filtered_courses:
# eta
eta = datetime.combine(today_min.date(), email_time, today_min.tzinfo)
create_course_report_pdf.apply_async(
eta=eta,
kwargs={
"course": str(course_id),
"mode": "email",
"user": celerybeat_worker.id,
},
)
# end
- create_course_report_pdf
@shared_task
@transaction.atomic
def create_course_report_pdf(course, mode="preview", user=None):
.....
# 10s ~ 3m job
.....
return report_pdf, pdf.report_title
рабочая среда
- signlebeat
- django celery beat
- celery 4.4.7
- redis-server 5.0.7
worker
- рабочий с одним ударом:
single-beat celery beat ... - celery worker:
celery --app=lms.celery:APP worker --loglevel=info --queues=edx.lms.core.default --hostname=edx.lms.core.default.%%h --concurrency=1 -O default
- рабочий с одним ударом:
варианты транспортировки фарфора
{
'fanout_patterns': True, 'fanout_prefix': True, 'visibility_timeout': 36000
}
- журнал одиночных ударов
- журнал сельдерея
2. Вопрос 2. Когда celery worker перезапускается, немедленно ли выполняется crontab?
- settings.CELERYBEAT_SCHEDULE
{
# send message at 8:30 am
"send-course-messages": {
"task": "hrd.emonitoring.tasks.enqueue_course_messages",
"schedule": crontab(hour="7", minute="30"),
"kwargs": {"send_time": dict(hour=8, minute=30)},
},
}
- проблема
- (Эта задача выполняется один раз. нет проблем.)
- celery отправляет сообщения в 8:30 утра
- Когда я перезапускаю рабочий в 11:00 утра, сельдерей повторно отправляет те же сообщения снова.