Celery Beat는 스케줄러입니다. celery의 task들 중 주기적으로 처리해야 될 작업들이 있다면 Celery Beat에게 설정만 해주고 맡기면 됩니다.
아래의 명령어를 이용해 celery-beat를 설치해줍니다.
pip install django-celery-beat
시간을 기반으로 작업을 처리하는 것인 만큼 시간에 대한 정의를 먼저 하고 넘어가야 합니다.
INSTALLED_APPS = (
...,
'django_celery_beat',
)
.
.
.
CELERY_TIMEZONE = 'Asia/Seoul'
CELERY_ENABLE_UTC=False
crontab은 배치 작업을 위해 특정 시간 뿐만 아니라 특정 요일과 같은 다양한 단위시간 설정을 지원합니다. celery에는 이를 사용할 수 있는 모듈을 포함하구 있고, 사용법은 아래와 같습니다.
그리고 예를 들어, 여기서 1분마다 설정을 해두었다면 현재 시간 기준으로 1분 간격이 아니라 01분 00초, 02분 00초, ..., 15분 00초
이렇게 시스템 상 00초 기준으로 작동이 되는 원리입니다~!!
from celery.schedules import crontab
app.conf.beat_schedule = {
'task_send_email': {
'task': 'qna.tasks.task_send_email',
'schedule': crontab(minute=0, hour=6) # 매일 6시간마다
}
}
예시 | 의미 |
---|---|
crontab() | 매분 실행합니다. |
crontab(minute=0, hour=0) | 매일 자정에 실행합니다. |
crontab(minute=0, hour='*/3') | 매분 실행합니다. |
crontab() | 3시간마다 실행: 자정, 오전 3시, 오전 6시, 오전 9시, 정오, 오후 3시, 오후 6시, 오후 9시. |
crontab(minute=0,hour='0,3,6,9,12,15,18,21') | 이전과 동일합니다. |
crontab(minute='*/15') | 15분마다 실행합니다. |
crontab(day_of_week='sunday') | 일요일에 매분(!) 실행합니다. |
crontab(0, 0, day_of_month='2') | 매월 2일에 실행합니다. |
crontab(minute='*/10',hour='3,17,22', day_of_week='thu,fri') | 10분마다 실행하되 목요일 또는 금요일 오전 3-4시, 오후 5-6시, 오후 10-11시 사이에만 실행합니다. |
더 자세한 설명은 Celery beat 공식 홈페이지를 참고하면 좋을 거 같습니다.
위와 같이 설정만 해주면 Celery beat는 간단하게 작업이 끝났습니다. beat를 구동시키기 전에 Celery를 우선적으로 작동시킨 후에 beat를 실행해주어야 합니다.
celery -A 프로젝트이름 beat
하지만 우리는 귀찮으니 한 번에 쓰는 방법 또한 있습니다!
celery -A config worker --beat -l info
참고자료 📩