원본 링크: https://www.codetd.com/en/article/13094105
특징
장점
단점
사용방식
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).minutes.do(job) # 매 10분마다 실행
schedule.every().hour.do(job) # 매 시간마다 실행
schedule.every().day.at("10:30").do(job) # 매일 10:30에 실행
schedule.every(5).to(10).minutes.do(job) # 매 5~10 초 마다 실행
schedule.every().monday.do(job) # 매 월요일 마다 실행
schedule.every().wednesday.at("13:15").do(job) # 매주 수요일 13:15시에 실행
# 스케쥴을 시작하기 위한 구문
while True:
schedule.run_pending()
time.sleep(1)
스케쥴러에 값을 전달해 실행
import schedule
import time
def job(text):
print(text)
schedule.every(10).minutes.do(job, "I'm working...") # 매 10분마다 실행
while True:
schedule.run_pending()
time.sleep(1)
특징
초기화
# Flask가 초기화 될 때 호출 될 수 있으며, 반환된 scheduler를 app에 할당
def init_scheduler():
# 지속성을 위한 코드로 해당 예제는 MongoDB를 사용
# client는 자신의 MongoDB 핸들러인 MongoClient 객체를 설정하는데 사용
jobstores = {
'default': MongoDBJobStore(client=your_db_handler, collection="schedule_job")
}
executors = {
'default': ThreadPoolExecutor(20)
}
job_defaults = {
'coalesce': False,
'max_instances': 5
}
# BackgruoundScheduler 사용 가능
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
# scheduler 사용을 위해선 start를 호출해야함
scheduler.start()
return scheduler
APScheduler 사용시 크게 2 가지 타입에 스케쥴 종류가 존재
BlockingScheduler: 단일 수행에 사용
BackgroundScheduler: 다중 수행에 사용
APScheduler 타이밍 작업시 세가지 유형으로 나뉨
interval: (예시) 5분마다 작업을 실행
cron: (예시) 매일 아침 5시에 작업을 실행
date: (예시) 2018-05-05일에 작업을 실행
cron 방식을 사용하는 예제
def test_job(name):
print "hello, %s" % name
def add_daily_job(name):
exec_time = datetime.now() + timedelta(minutes=2)
hour = exec_time.strftime("%H")
minute = exec_time.strftime("%M")
# 동작 방식에 'cron'을 선택
# job_id을 설정 시,remove_job에서 사용 가능
current_app.scheduler.add_job(
test_job, 'cron', hour=hour, minute=minute,
args=[name], id=job_id)
예약된 작업 삭제
add_job에서 사용하는 job_id를 통해 해당 타임 태스크 삭제 가능
작업을 추가하면 APScheduler는 해당 작업 정보를 작업 저장소에 설정된 영구 저장 체계에 저장
예시는 MongoDB를 사용하며, 태스크는 MongoDB에 저장되며, 삭제 시 MongoDB에서도 삭제됨
def remove_daily_job(job_id):
#설정 한 job_id를 기반으로 삭제
current_app.scheduler.remove_job(job_id)
APScheduler는 큰 유연성을 가지고 있으며, 대부분의 요구사항을 충족
Schedule은 가볍고 사용하기 쉽지만 작업 지속성을 지원하지 않으며, 작업을 동적으로 추가 삭제 할 수 없음