본문 바로가기
Django/Celery

Celery beat으로 주기적으로 tasks 수행하기

by 붕어사랑 티스토리 2021. 3. 16.
반응형

docs.celeryproject.org/en/stable/userguide/periodic-tasks.html

 

Periodic Tasks — Celery 5.0.5 documentation

This document describes the current stable version of Celery (5.0). For development docs, go here. Periodic Tasks celery beat is a scheduler; It kicks off tasks at regular intervals, that are then executed by available worker nodes in the cluster. By defau

docs.celeryproject.org

해당문서는 상기링크의 번역문입니다. 일부 영양가 없는 내용은 제외되었습니다.

 

 

 

소개

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

댓글