schedule 모듈 활용
while 반복문을 활용하여 꾸준히 스케줄을 유지한다. (특정 조건에 만족하는 스케줄이 있을 때마다 해당 함수 실행)
# 패키지 다운로드
# 아나콘다 노트북
!pip show schedule # schedule이 있는지 확인
!pip install schedule # 설치
만약 노트북 내에서 import를 하였는데도 실행이 되지 않는다면 아나콘다 프롬포트에서 설치를 한 후 다시 설치를 실행해야한다.
import schedule
import time
# 스케줄에 의해 실행될 코드를 담는 함수 선언
def job() :
now = time.localtime()
print(f"{now.tm_year:04d}-{now.tm_mon:02d}-{now.tm_mday:02d} {now.tm_hour:02d}:{now.tm_mon:02d}:{now.tm_sec:02d}")
schedule.every(10).seconds.do(job) # 단위시간 지정
# 아무것도 넣지 않으면(1초 단위) -> second
while True:
schedule.run_pending() # 스케줄링 함수 실행 요청
time 패키지를 import 하여 time.localtime()을 사용하여 스케줄 사용방법에 대해 알아 보는 코드이다.
schedule.every(10).seconds.do(job) 매 10초 마다 schedule 을 실행시키게 되며 every(2), every(10) 등 숫자가 들어있다면 뒤에 second에는 s를 붙여 사용하여야 한다.
>> 여기서 위에 코드는 실행을 멈춘 후 다시 실행을 시키면 출력값이 두 개 나오는 것을 알 수 있다.
schedule은 무한 반복인 while문에 들어있는데 그것을 멈추기 위해 정지 버튼을 누르게 되면 겉보기 상 스케줄의 활동이 멈춘 것 같아 보이지만, 백그라운드에서는 아직 job함수가 살아서 매 10초마다 활동을 하기 때문이다.
해결하기 위해서는 멈춘 후에 다시 커널을 재시작하여야 한다.
import schedule
import time
# 스케줄에 의해 실행될 코드를 담는 함수 선언
def job() :
now = time.localtime()
print(f"{now.tm_year:04d}-{now.tm_mon:02d}-{now.tm_mday:02d} {now.tm_hour:02d}:{now.tm_mon:02d}:{now.tm_sec:02d}")
schedule.every(3).seconds.do(job) # 매 3 초마다 job함수 실행
schedule.every(3).minutes.do(job) # 매 3 분마다 job 함수 실행
schedule.every(3).hours.do(job) # 매 3 시간마다 job 함수 실행
schedule.every(3).days.do(job) # 매 3 일마다 job 함수 실행
schedule.every(3).weeks.do(job) # 매 3 주마다 job 함수 실행
schedule.every().hour.at(':23').do(job) # 매 시간 23분 마다 job 함수 실행
schedule.every().minute.at(':23').do(job) # 매 분 23초 마다 job 함수 실행
schedule.every(5).hours.at('20:30').do(job) # 매 5시간 째 20분 30초 마다 job함수 실행
# 만약 현재 시간이 02:00 이면 첫 실행은 06:20:30 에 실행 (5시간째 되는 6:20:30)
# 매일 지정된 시간에 job함수를 실행 하려면
schedule.every().day.at('10:30:30').do(job)
# 지정된 요일 및 시간에 job함수 실행
schedule.every().monday.do(job) # 자정이 넘어가면 바로 실행
schedule.every().wednesday.at('13:25').do(job) # 자정이 넘어가면 바로 실행
# 월을 의미하는 month 속성은 없다. 특정일을 지정하는 방법은 없음
while True:
schedule.run_pending()
>> schedule.every(5).hours.at('20:30').do(job) # 매 5시간 째 20분 30초 마다 job함수 실행
# 만약 현재 시간이 02:00 이면 첫 실행은 06:20:30 에 실행 (5시간째 되는 6:20:30)
2:00 + 5시간째가 되는 시간은 6:00 가 되는 시간이다. 아직은 헷갈리는 것 같지만 6:01 부터는 5시간째가 되는 시간이기 때문에 첫 실행시간은 7:20:30 이 아닌 6:20:30이 되는 것이다.
# 월을 의미하는 month 속성은 없다. 특정일을 지정하는 방법은 없음
> schedule 은 특정 시간을 지정하며 실행 하지만 특정일을 따로 지정 하는 방법이 없기 때문에 다른 방법을 사용하여 특정일을 지정하여야 한다.
특정일을 지정하는 방법은 아래와 같다.
from datetime import date
# 매월 1일 2시에 작업 실행
def job():
if date.today().day != 1:
return
# 실제 job 실행 코드 작성
schedule.every().day.at('02:00').do(job)
job 함수 안에 'if date.today().day != 1:' 의 의미는 1이 아니면 return 값에 공백을 놓은 것으로 보아 함수를 그만하라는 사인이다. 때문에 1일 일때만 조건에 True라는 의미이다.
그리고 그 함수에 조건이 해당되면 schedule이 실행된다.
schedule 함수 실행취소하기
import schedule
import time
def message1():
print("every 1s scedule1 run")
def message2(text):
print(text + "scedule2 run")
job1 = schedule.every().second.do(message1)
job2 = schedule.every(2).seconds.do(message2, text = "매 2초")
# 스레드 처리가 되어진다.
count = 0
while True:
schedule.run_pending()
time.sleep(1) # 1초가 되기 전에 job1 스케줄이 취소가 되는 상황이 발생됨
count+=1
print(job1)
if count > 5:
print(job1)
schedule.cancel_job(job1)
# 스레드 : 하나의 독립적인 프로세스 처리 단위
# 동시다발적으로 보일뿐 실제로 동시다발적이진 않다. (우선순위 선점방식 / 출력물이 계속 같을 수는 없다.)
count = 0 은 함수의 조건을 걸기 위해 설정하였다.
>> time.sleep(1)을 넣은 이유:
schedule은 무한 반복문인 while문 안에 들어있다. while문은 빠른 속도로 코드를 계속 반복 시키기 때문에 time.sleep()을 넣어주지 않으면 스케줄 job1 과 job2 는 매 1,2초 마다 실행되지만 while 문은 CPU의 처리 속도만큼 반복 수행 되어 제 1초가 되기도 전에 job 1의 실행이 취소 된다.
job함수에 인수값 전달
import schedule
import time
def greet(name):
print("Hello", name)
now = time.localtime()
print(f"{now.tm_year:04d}-{now.tm_mon:02d}-{now.tm_mday:02d} {now.tm_hour:02d}:{now.tm_mon:02d}:{now.tm_sec:02d}")
schedule.every(1).seconds.do(greet,name = 'Alice')
# schedule.every(1).second.do(greet,name = 'Alice') 가능
while True:
schedule.run_pending()
지정된 시간까지 job실행
datetime 패키지의 datetime과 time을 사용한다.
until을 사용하여 날짜와 시간을 표현하는 두가지 방식을 알 수 있다.
자원의 효율성을 위해 if not schedule.jobs 이라는 조건문을 걸어 스케줄에 등록된 job이 없는 경우 중단하도록 하였다.
import schedule
from datetime import datetime,time
import time
def job() :
now = time.localtime()
print(f"{now.tm_year:04d}-{now.tm_mon:02d}-{now.tm_mday:02d} {now.tm_hour:02d}:{now.tm_mon:02d}:{now.tm_sec:02d}")
# 오늘 18시 30분까지 job 실행
schedule.every(5).second.until('11:32:00').do(job)
# 2023-12-31 18:00 까지 실행
# 년월일은 해석 가능한 형태로만 넣어주면 됨
schedule.every().hour.until('2023-12-31 18:00').do(job)
schedule.every().hour.until(datetime(2023,12,31,18,00,00)).do(job)
while True:
if not schedule.jobs: # 스케줄에 등록된 job이 없는 경우 중단하도록 함
break
schedule.run_pending()
time.sleep(1)
# 매 1초마다 체크
'국비 교육 > 데이터' 카테고리의 다른 글
[데이터 시각화] matplotlib - 2 (0) | 2023.11.04 |
---|---|
[데이터 시각화] matplotlib - 1 (0) | 2023.11.04 |
[데이터 수집] BeautifulSoup + Selenium 실습 (0) | 2023.11.02 |
[데이터 수집] 셀레니움 - 2 (구글 이미지 실습) (0) | 2023.11.02 |