반응형
Python apscheduler
매달, 매달 특정일, 매일, 매일 특정 시간,분,초 등등
원하는 시간에 python script 를 실행하고 싶을 때 사용합니다.
대표적인것으로 schedule 와 apscheduler 가 있는데
apscheduler 사용법을 알아보겠습니다.
pip install APScheduler
자주 사용하는 BlockingScheduler 와 BackgroundScheduler 를 설명하겠습니다.
소스로 이해하기 - BlockingScheduler
import time
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
# 매일 12시 30분에 실행
@sched.scheduled_job('interval', seconds=5, id='test_1')
def job1():
print(f'job1 : {time.strftime("%H:%M:%S")}')
# 매일 12시 30분에 실행
@sched.scheduled_job('cron', hour='12', minute='30', id='test_2')
def job2():
print(f'job2 : {time.strftime("%H:%M:%S")}')
# 이런식으로 추가도 가능. 매분에 실행
sched.add_job(job2, 'cron', second='0', id="test_3")
print('sched before~')
sched.start()
print('sched after~') # 여긴 실행 안됨. Blocking 이기 때문에.
출력은
sched before~
job1 : 16:46:28
job1 : 16:46:33
# 이하 생략
"sched after~" 가 출력되지 않습니다.
sched.start() 에서 멈춰있는거죠. 그게 blocking 입니다.
BackgroundScheduler
sched 를 backgroundScheduler 로 바꿔보겠습니다.
위 소스에서 아래 부분만 바꿔주세요.
# from apscheduler.schedulers.blocking import BlockingScheduler
# sched = BlockingScheduler()
from apscheduler.schedulers.background import BackgroundScheduler
sched = BackgroundScheduler()
그리고 실행하면,
sched before~
sched after~
Process finished with exit code 0
프로그램이 바로 끝나버립니다.
sched.start() 다음에도 뭔가 작업을 해야한다면 Background 로 실행해야겠죠.
Background 를 테스트하려면 아래와 같은 방법으로 하면 됩니다.
import time
from apscheduler.schedulers.background import BackgroundScheduler
sched = BackgroundScheduler()
# 5초마다 실행
@sched.scheduled_job('interval', seconds=5, id='test_1')
def job1():
print(f'job1 : {time.strftime("%H:%M:%S")}')
# 매일 12시 30분에 실행
@sched.scheduled_job('cron', hour='12', minute='30', id='test_2')
def job2():
print(f'job2 : {time.strftime("%H:%M:%S")}')
# 이런식으로 추가도 가능. 매분에 실행
sched.add_job(job2, 'cron', second='0', id="test_3")
print('sched before~')
sched.start()
print('sched after~')
while True:
time.sleep(1)
그럼 프로그램이 종료되지 않고 스캐줄 작업을 합니다.
파라메터 : id
작업 id 로 중복된 작업을 하지 않는데 사용합니다.
# 5초마다 실행
@sched.scheduled_job('interval', seconds=5, id='test_1')
def job1():
print(f'job1 : {time.strftime("%H:%M:%S")}')
i=0
while i < 8:
time.sleep(1)
i+=1
print('job1 end!')
5초에 한번씩 job1() 을 실행하는데, job1() 은 8초 후 종료하게 되어있습니다.
그럼 job1()을 실행하고 5초후에 job1()을 실행 하려고 할때 id 가 'test_1' 인것이 실행 중 이므로 추가실행을 안합니다.
출력 결과는 아래와 같습니다.
sched before~
sched after~
job1 : 17:04:26
Execution of job "job1 (trigger: interval[0:00:05], next run at: 2020-09-04 17:04:31 KST)" skipped: maximum number of running instances reached (1)
job1 end!
job1 : 17:04:36
Execution of job "job1 (trigger: interval[0:00:05], next run at: 2020-09-04 17:04:41 KST)" skipped: maximum number of running instances reached (1)
job1 end!
# 반복..
추가
아래와 같이 콤마로 여러 시간,분등을 설정할 수 있습니다.
# 매일 [9시15분, 9시45분, 15시15분, 15시45분]에 실행
@sched.scheduled_job('cron', hour='9,15', minute='15,45', id='test_2')
def job2():
print(f'job2 : {time.strftime("%H:%M:%S")}')
728x90
반응형
'Python' 카테고리의 다른 글
[Python] get number from string #텍스트에서 숫자만 가져오기 (0) | 2020.09.06 |
---|---|
[Python] list 를 text file 에 한줄씩 쓰기 ( \n 안나오게 ) (0) | 2020.09.05 |
Python Decorator 파라메터 사용하기 #decorator parameter (3) | 2020.09.03 |
Python Decorator 란? 사용 방법. #Python Decorator (0) | 2020.09.03 |
[pyQT5] pyQT Button. 버튼 클릭 이벤트 #pyQT Button (0) | 2020.08.15 |
댓글