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의 예시
Example | Meaning |
crontab() | #1분마다 실행 |
crontab(minute=0, hour=0) | # 매일 자정에 실행 |
crontab(minute=0, hour='*/3') | #매일 3의배수의 시간대마다 실행 : midnight, 3am, 6am, 9am, noon, 3pm, 6pm, 9pm. |
| Same as previous. |
crontab(minute='*/15') | #매일 15분마다 실행 : 정각, 15분 30분 45분 .... |
crontab(day_of_week='sunday') | #일요일에! 1분마다 실행. |
| Same as previous. |
| # 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. |
| # 짝수 날에 실행 |
| # 매달 첫째주, 셋째주에 실행 |
| # 매년 5월 11일에 실행 |
| # 4분기로 나누고 첫달마다 실행 |
Solar schedules 예시
일출, 일몰, 새벽 또는 황혼에 따라 실행해야 하는 작업이 있을 경우에 사용할 수도 있다.
마땅히 사용할 때가 떠오르지는 않지만 필요한 분들이 있을지도 모르니,,
전달인자는 solar( event, latitude, longitude) 로 설정한다. 예시는 멜버른의 위도 경도인 것 같다.
Sign | Argument | Meaning |
+ | latitude | North |
- | latitude | South |
+ | longitude | East |
- | longitude | West |
위도 경도를 잘 확인하고 쓰자!
다음은 event의 전달인자로 들어갈 수 있는 타입이다.
Event | Meaning |
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 |