본문 바로가기
Django

[django celery]테스크 주기 설정하기

by 이농이능 2018. 2. 2.

Celery Beat


Celery beat 는 스케줄러로써 규칙적인 간격으로 작업을 시작한다. 찾아보니 원하는 초,분,시간 단위로 설정할 수도 있고 일주일에 한번, 이런식으로도 crontab 등의 api를 이용해서 설정할 수 있기에 이를 정리해보고자 한다.

장고 프로젝트에 celery와 redis 를 설치한 상태에서 이 포스팅을 보면 좋을 듯 하다.

 http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html 를 정리한 내용이다. 


Time Zones

Django 프로젝트 폴더에서 [프로젝트명]과 같은 폴더가 있는데 그 안에 settings.py 가 있다. 

디폴트 값은 'UTC' 로 되어있는데 한국시간에 맞추려면 'Asia/Seoul' 로 바꿔준다.


그러나 한국시간대에 맞는 서비스만을 제공할 수 있으므로 주의하자. ( 참고자료 )

나는 연습용이기에 시간대를 한국시간으로 맞춰준다. 





다음은 테스크의 주기를 설정한 코드.


프로젝트에 celery.py 를 추가하고 테스크의 주기와 함께 전달인자도 넣어서 보내줄 수 있다.


app.conf.beat_schedule 에 설정한 것을 보게되면

'add-every-30-minutes-crontab' 하고 스케쥴에 crontab(minutes='*/30') 되어있는데 task.py 파일에 작성한  check_new_update_ted() 함수를 30분마다 실행하게 해 주는 것이다.


서버를 키고나서 30분마다인가 했더니, 1시, 1시30분, 2시, 2시 30분.... 이렇게 진행되는 것이었다



crontab schedules의 예시


ExampleMeaning
crontab()#1분마다 실행
crontab(minute=0, hour=0)

# 매일 자정에 실행

crontab(minute=0, hour='*/3')

#매일 3의배수의 시간대마다 실행 : midnight, 3am, 6am, 9am, noon, 3pm, 6pm, 9pm.

crontab(minute=0,
hour='0,3,6,9,12,15,18,21')
Same as previous.
crontab(minute='*/15')

#매일 15분마다 실행 : 정각, 15분 30분 45분 ....

crontab(day_of_week='sunday')

#일요일에! 1분마다 실행.

crontab(minute='*',
hour='*', day_of_week='sun')
Same as previous.
crontab(minute='*/10',
hour='3,17,22',day_of_week='thu,fri')

# 10분마다 실행, but only between 3-4 am, 5-6 pm, and 10-11 pm 목요일과 금요일에

crontab(minute=0, hour='*/2,*/3')

# 짝수 시간과 3의 배수 시간에 실행. This means: at every hour except: 1am, 5am, 7am, 11am, 1pm, 5pm, 7pm, 11pm

crontab(minute=0, hour='*/5')

# 5의 배수 시간에 실행. 5시 10시 15시 (오후 5시에 실행되는것 아님)

crontab(minute=0, hour='*/3,8-17')

# 오전 8시부터 오후 5시 사이에 3의 배수 시간에 실행

crontab(0, 0, day_of_month='2')

# 매월 두번 째 날에 실행

Execute on the second day of every month.

crontab(0, 0,
day_of_month='2-30/3')

# 짝수 날에 실행
Execute on every even numbered day.

crontab(0, 0,
day_of_month='1-7,15-21')

# 매달 첫째주, 셋째주에 실행
Execute on the first and third weeks of the month.

crontab(0, 0, day_of_month='11',
month_of_year='5')

# 매년 5월 11일에 실행
Execute on the eleventh of May every year.

crontab(0, 0,
month_of_year='*/3')

# 4분기로 나누고 첫달마다 실행
Execute on the first month of every quarter.




Solar schedules 예시


일출, 일몰, 새벽 또는 황혼에 따라 실행해야 하는 작업이 있을 경우에 사용할 수도 있다. 

마땅히 사용할 때가 떠오르지는 않지만 필요한 분들이 있을지도 모르니,, 


from celery.schedules import solar

app.conf.beat_schedule = {
    # Executes at sunset in Melbourne
    'add-at-melbourne-sunset': {
        'task': 'tasks.add',
        'schedule': solar('sunset', -37.81753, 144.96715),
        'args': (16, 16),
    },
}


전달인자는 solar( event, latitude, longitude) 로 설정한다. 예시는 멜버른의 위도 경도인 것 같다.


SignArgumentMeaning
+latitudeNorth
-latitudeSouth
+longitudeEast
-longitudeWest


위도 경도를 잘 확인하고 쓰자!


다음은 event의 전달인자로 들어갈 수 있는 타입이다.


EventMeaning
dawn_astronomical  

하늘이 더이상 어두워지지 않을 때 실행함. 태양이 수평선보다 18도 아래에 있을 때이다.

dawn_nautical

지평선에 햇빛이 있을 때 실행. 태양이 수평선의 12도 아래에 있을 때.

dawn_civil

실외 활동을 시작할 수 있는, 개체를 구분할 수 있을만큼 빛이 있을 때 실행. 태양이 수평선보다 6도 아래에 있을 때.

sunrise

태양의 위쪽 가장자리가 아침에 동쪽 지평선 위에 나타날 때 실행.

solar_noon

태양이 수평선에서 제일 높을 때 실행.

sunset

저녁 시간에 서쪽 지평선 위로 태양의 가장자리가 사라질 때 실행.

dusk_civil

황혼이 끝나고 물체가 구별될 수 있고 일부 별과 행성이 보일 때 실행. 태양이 수평선보다 6도 아래에 있을 때.

dusk_nautical

태양이 수평선보다 12도 아래에 있을 때 실행. 육안으로 객체를 구분할 수 없을 때.

dusk_astronomical

하늘이 완전히 어두워지는 순간에 실행. 태양이 수평선의 아래 18도일 때




이를 통해서 주기를 잘 설정하면 좋을 듯 하다!!



'Django' 카테고리의 다른 글

[django] ajax 사용해서 화면 수정  (2) 2018.03.19
django paginator 페이지 수 제한하기  (0) 2018.02.20
[Django] Celery Redis 설치  (0) 2018.01.30
python 파일 존재여부  (0) 2018.01.29
csrf 및 form 구현  (0) 2018.01.25