Python Schedule vs ASPcheduler

설탕유령·2022년 5월 10일
0

원본 링크: https://www.codetd.com/en/article/13094105

[Schedule]

특징

  • 가벼운 스케쥴 라이브러리

장점

  • 사용이 간단하며 구성이 필요 없음

단점

  • 동적으로 작업을 추가하거나 작업을 지속 할 수 없음

사용방식

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)

[APScheuler]

특징

  • 프로그램에서 타이밍 작업을 동적으로 추가 및 삭제 가능
  • 지속성을 지원하며, 지속성 체계가 다양함

초기화

# 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은 가볍고 사용하기 쉽지만 작업 지속성을 지원하지 않으며, 작업을 동적으로 추가 삭제 할 수 없음

profile
달콤살벌

0개의 댓글