장고 프로젝트를 진행하면서 정기적으로 함수를 수행시켜줄 스케줄러가 필요했다.
사용한 스케줄러에는 apscheduler와 crontab이 있다. 차이점은 apscheduler는 장고 위에서 실행되어서 runserver시 print()로 바로바로 실행 확인이 가능했다.
crontab의 경우 리눅스에 테스크들을 등록하여 사용하고 실행 시간도 장고 프로젝트에 설정된 시간이 아닌 리눅스 시간으로 반영된다. crontab에서는 print()가 바로 콘솔에 찍히는 것이 아니라 log파일을 따로 설정하여 확인할 수 있다.
(Windows환경에서는 crontab을 사용할 수 없다.)
Django - apscheduler
apscheduler 라이브러리를 설치한 후에 사용할 수 있다.
pip install django-apscheduler
settings.py에서 INSTALLED_APPS에 apscheduler 라이브러리를 추가해 주어야 한다.
INSTALLED_APP = [
'django_apscheduler',
...
]
스케줄러를 사용할 django app의 views.py에 관련 코드를 작성하면 된다.
from apscheduler.schedulers.background import BackgroundScheduler
sched = BackgroundScheduler()
@sched.scheduled_job('cron',year='해',month='월',day='일',hour='시', minute = '분',second='초' ,name = 'schedulerName')
def schedulerF():
...
sched.start()
year(int/str) -> 실행할 연도 4자리
month(int/str) -> 실행할 월 1-12
day(int/str) -> 실행할 일 1-31
week(int/str) -> 실행할 주차 수 1-53
day_of_week(int/str) -> 실행할 요일 0-6 | mon,tue,wed,thu,fri,sat,sun
hour(int/str) -> 실행할 시간 0-23
minute(int/str) -> 실행할 분 0-59
second(int/str) -> 실행할 초 0-59
timezone(timezoneInfo|str) -> 사용할 timezone
특정 인자만 선택해서 설정해주면 되고, 생략한 경우에는 항상 실행된다고 생각하면 된다.
Django - crontab
crontab 라이브러리를 설치한 후에 사용할 수 있다.
pip install django-crontab
settings.py에서 INSTALLED_APPS에 crontab 라이브러리를 추가해 주어야 한다.
crontab은 settings.py에 사용할 스케줄러를 작성한다.
스케줄러로 실행 할 함수를 미리 다른 django app의 하위 파일에 작성하고 해당 함수를 스케줄러에 등록한다.
INSTALLED_APPS = [
'django_crontab',
...
]
...
CRONJOBS = [
('분 시 일 월 해','appName,fileName,functionName'),
('* * * * *','appName,fileName,functionName'),
...
]
분,시,일,월,년 순서로 실행 주기를 설정하면 된다. appName과 fileName에 등록할 스케줄러 함수를 작성한 django app의 이름과 파일 이름을 작성하면 된다.
매번 실행 : *
ex) 매 분 실행 -> ( *, 시, 일, 월, 해)
특정 구간 실행 : -
ex) 5시부터 7시 사이에만 실행 -> ( 분, 5-7, 일, 월, 해)
특정 구간 반복 : */
ex) 5일 간견으로 실행 -> ( 분, 시, */5 월, 해)
참고로 crontab의 경우 분,시,일,월,해 생략없이 전부 작성해야 하는 듯 하다.
터미널에 아래 crontab 명령어를 입력하여 스케줄러를 등록,확인,삭제 할 수 있다.
--settings.py에 작성한 스케줄러 등록
python manage.py crontab add
--등록된 스케줄러 확인
python manage.py crontab show
--등록된 스케줄러 전체 삭제
python manage.py crontab remove
마지막으로 crontab의 경우 리눅스 시간으로 동작하기 때문에 django 서버 시간과 리눅스 시간을 동일하게 맞추거나 리눅스와의 시간 차이를 계산하여 스케줄러를 사용해야한다.
만약 시간을 잘 설정했음에도 스케줄러가 동작하지 않는다면 인코딩 관련 문제 일 수 있다. 한글 메시지를 사용할 경우
터미널에 crontab -e를 입력하여 파일 맨위에 아래 설정을 지정해주어 해결하면 된다.
PYTHONIOENCODING=utf8