반응형
APScheduler
python script를 원하는 시간에, 혹은 원하는 주기마다 실행해야 한다면 스케줄링에 대해 고민해야한다.
나의 경우는 DB에 데이터를 업데이트 하기 위한 python 파일을 일정 시간(1시간, 10분 등)마다 실행하고자 했다.
이런 경우 python 스케줄링 라이브러리로 APScheduler를 사용해보자.
데몬이 아니며 이미 존재하는 앱 내에서 간단한 구현으로 쉽게 사용이 가능하고, SQLAlchemy, mongoDB, Redis 등의 백엔드와 함께 사용 가능하다.
공식 문서 https://apscheduler.readthedocs.io/en/3.x/
트리거 타입 종류
- date : 특정 시점에 작업을 한 번만 실행
- ex) run_date='2023-07-20 15:30:00' 설정으로 2023-07-19 18:00 실행
- → 2023-07-20 15:30:00
- interval : 고정된 간격으로 작업을 실행
- ex) minute="7" 설정으로 2023-07-19 15:05 실행
- → 2023-07-19 15:12, 2023-07-19 15:19, 2023-07-19 15:26 ...
- cron : 리눅스의 cron 형식으로 실행
- ex) minute="0/7" 설정으로 2023-07-19 15:05 실행
- → 2023-07-19 15:07, 2023-07-19 15:14, 2023-07-19 15:21 ...
Scheduler
필요성에 맞게 다양한 scheduler를 선택할 수 있다. 그 중 자주 사용하는 두 가지를 소개한다.
공식 문서 choosing-the-right-scheduler
BlockingScheduler
스케줄러가 프로세스에서 유일하게 실행 중인 것일 때 사용
BackgroundScheduler
스케줄러를 애플리케이션 내부의 백그라운드에서 실행
설치
pip install apscheduler
decorator 방식으로 APScheduler 사용하기
id 는 고유 수행번호로 겹치면 수행되지 않는다. 만약 겹치면 'Job identifier (test_1) conflicts with an existing job' 라는 에러가 발생한다.
from apscheduler.schedulers.background import BackgroundScheduler
import time
sched = BackgroundScheduler()
# interval - 매 3초마다 실행
@sched.scheduled_job('interval', seconds=3, id="test_1")
def job1():
print(f'job1 : {time.strftime("%H:%M:%S")}')
# cron - 매 5초마다 실행
# 파라미터를 상황에 따라 여러개 넣어도 된다.(minute="30", second="10" -> 매시간 30분 10초에 실행)
@sched.scheduled_job('cron', second='*/5', id="test_2")
def job2():
print(f'job2 : {time.strftime("%H:%M:%S")}')
# date - 2023-07-19 12시 실행
@sched.scheduled_job('date', run_date='2023-07-19 12:00:00', id="test_3")
def job3():
print(f'job3 : {time.strftime("%H:%M:%S")}')
sched.start()
# 프로그램이 종료되지 않고 스케쥴링
while True:
time.sleep(1)
add_job 방식으로 APScheduler 사용하기
from apscheduler.schedulers.background import BackgroundScheduler
import time
sched = BackgroundScheduler()
def job():
print(time.strftime('%H:%M:%S'))
# interval - 매 3초마다 실행
sched.add_job(job, 'interval', seconds=3, id="test_1")
# cron - 매 5초마다 실행
sched.add_job(job, 'cron', second='*/5', id="test_2")
# date - 2023-07-19 12시 실행
sched.add_job(job, 'date', run_date='2023-07-19 12:00:00', id="test_3")
sched.start()
반응형
'Python' 카테고리의 다른 글
[python] DataFrame 결합 - pandas.concat (0) | 2023.07.28 |
---|---|
[python] ast.literal_eval VS eval 비교하기 (0) | 2023.07.26 |
[python] csv 모듈 사용하기 (0) | 2023.07.25 |
[python] pymysql VS sqlalchemy 소개 및 사용법 (0) | 2023.07.19 |
[python] logging 사용하기 (0) | 2023.07.18 |