docs.celeryproject.org/en/stable/userguide/periodic-tasks.html
해당문서는 상기링크의 번역문입니다. 일부 영양가 없는 내용은 제외되었습니다.
소개
celery beat은 주기적으로 task를 수행하는 스케쥴러입니다. 간단하쥬?
Timezone
app.conf.timezone = 'Asia/Seoul'
Django에서는 setting.py에서 아래와 같이 TIME_ZONE 변수에 설정해주도록 합시다.
TIME_ZONE = 'Asia/Seoul'
여기서 추가로 주의해주어야 할 점은 timezone에 관한 설정을 바꿔도 데이터베이스이 스케쥴러는 변하지 않습니다.
고로 하기와 같이 직업 업데이트 해 주어야 합니다.
$ python manage.py shell
>>> from djcelery.models import PeriodicTask
>>> PeriodicTask.objects.update(last_run_at=None)
Entry 추가하기
자 이제 본격적으로 주기적으로 실행할 task들을 추가해 봅시다.
첫번째 방법은 on_after_configure 데코레이션과 add_periodic_task 함수를 이용하는 것입니다.
from celery import Celery
from celery.schedules import crontab
app = Celery()
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# 10초마다 test('hello') 수행
sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')
# 30초마다 test('world') 수행
sender.add_periodic_task(30.0, test.s('world'), expires=10)
# 매주 월요일 7:30에 test.('Happy Mondays!') 실행
sender.add_periodic_task(
crontab(hour=7, minute=30, day_of_week=1),
test.s('Happy Mondays!'),
)
@app.task
def test(arg):
print(arg)
one_after_configure 데코레이션은 app이 setup 된 이후에 tasks들을 periodic task에 추가해 줍니다.
add_periodic_tasks함수는 beat_schedule에 task를 보내주는 함수입니다. 파이썬 쉘에서 직접 사용하실수도 있습니다.
(허나 이 방법은 자주 쓰이지 않는거 같네요. 검색하면 위 방법은 거의 안나오고 아래 두번쨰 방법을 사용하네요.)
두번째 방법으로 아래와 같이 setting 단계에서 직접 세팅하실 수 도 있습니다.
app.conf.beat_schedule = {
'add-every-30-seconds': { # 스케쥴링의 이름
'task': 'tasks.add', # 수행해줄 task 설정
'schedule': 30.0, # 수행할 시간 설정
'args': (16, 16) # 인풋값 설정
},
}
app.conf.timezone = 'Asia/Seoul'
Crontab
위 두번째 방법을 이용하면서 시간 설정 시, Crontab을 이용하시면 시관에 관한 설정을 보다 자세하게 설정 하실 수 있습니다.
from celery.schedules import crontab # crontab 임포트
app.conf.beat_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), # 매주 월요일 7시 30분에 실행
'args': (16, 16),
},
}
여기서 day_of_week = 1 은 월요일을 의미합니다.
0 = 일요일
~
6 = 토요일
쉽쥬?
아래는 crontab 문법의 예시입니다. 참고하세용.
코드 | 의미 |
crontab() | 매 분 마다 실행 |
crontab(minute=0, hour=0) | 매일 자정마다 실행 |
crontab(minute=0, hour='*/3') | 3시간마다 실행, 3시 6시 9시 12시 15시 18시 21시 |
crontab(minute=0,hour='0,3,6,9,12,15,18,21') | 위와 동일 |
crontab(minute='*/15') | 매 15분마다 실행 |
crontab(day_of_week='sunday') | 일요일만 매 분마다 실행 |
crontab(minute='*',hour='*', day_of_week='sun') | 위와 동일 |
crontab(minute='*/10',hour='3,17,22', day_of_week='thu,fri') | 매 10분마다 실행, 그러나 3~4시, 17~18시, 22~23시, 목요일과 금요일에만 |
crontab(minute=0, hour='*/2,*/3') | 짝수시, 3으로 나눠시는 시에 실행 |
crontab(minute=0, hour='*/3,8-17') | 8시에서 5시에는 항상, 나머지는 3으로 나눠지는 시에 실행 |
crontab(0, 0, day_of_month='2') | 짝수달에 실행 |
crontab(0, 0,day_of_month='2-30/2') | 짝수 일에 실행 |
crontab(0, 0,day_of_month='1-7,15-21') | 달 첫째주와 셋째주에 실행 |
crontab(0, 0, day_of_month='11',month_of_year='5') | 5월 11일에 실행 |
crontab(0, 0,month_of_year='*/3') | 매분기 1일에 실행 |
'Django > Celery' 카테고리의 다른 글
Django에서 Celery 이용하기 두번째 (0) | 2021.02.28 |
---|---|
Django에 Celery 적용하기 첫번째 (4) | 2021.02.28 |
댓글