반응형
특정시간마다 배치를 돌릴 수 있는 기능이 필요해서 스케줄링을 찾아보다가 2개를 발견했습니다.
1) schedule
2) apscheduler
각각의 활용방법에 대해 알아보도록 하겠습니다
1) schedule
schedule 는 명령어가 직관적으로 알아볼 수 있어서 사용에 용이합니다.
설정이 복잡해질 경우 사용여부를 고려해야할 것 같습니다.
설치: pip install schedule
# 사용방법 import schedule import time def job(): print("I'm working...") # 10초에 한번씩 실행 schedule.every(10).second.do(job) # 10분에 한번씩 실행 schedule.every(10).minutes.do(job) # 매 시간 실행 schedule.every().hour.do(job) # 매일 10:30 에 실행 schedule.every().day.at("10:30").do(job) # 매주 월요일 실행 schedule.every().monday.do(job) # 매주 수요일 13:15 에 실행 schedule.every().wednesday.at("13:15").do(job) while True: schedule.run_pending() time.sleep(1)
2) apscheduler
파이썬 공식문서에 링크가 등록되어 있습니다.
https://pypi.org/project/APScheduler/3.2.0/
수행방식은 3가지가 있습니다
- Cron 방식 - Cron 표현식으로 수행
- Date 방식 - 특정 날짜에 수행
- Interval 방식 - 일정 주기로 수행
각각의 방식마다 파라미터가 달라집니다.
설치: pip install apscheduler
# 사용방법 # 스케줄 종류에는 여러가지가 있는데 대표적으로 BlockingScheduler, BackgroundScheduler 입니다 # BlockingScheduler 는 단일수행에, BackgroundScheduler은 다수 수행에 사용됩니다. # 여기서는 BackgroundScheduler 를 사용하겠습니다. from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.jobstores.base import JobLookupError import time def job(): print("I'm working...", "| [time] " , str(time.localtime().tm_hour) + ":" + str(time.localtime().tm_min) + ":" + str(time.localtime().tm_sec)) def job_2(): print("Job2 실행: ", "| [time] " , str(time.localtime().tm_hour) + ":" + str(time.localtime().tm_min) + ":" + str(time.localtime().tm_sec)) # BackgroundScheduler 를 사용하면 stat를 먼저 하고 add_job 을 이용해 수행할 것을 등록해줍니다. sched = BackgroundScheduler() sched.start() # interval - 매 3조마다 실행 sched.add_job(job, 'interval', seconds=3, id="test_2") # cron 사용 - 매 5초마다 job 실행 # : id 는 고유 수행번호로 겹치면 수행되지 않습니다. # 만약 겹치면 다음의 에러 발생 => 'Job identifier (test_1) conflicts with an existing job' sched.add_job(job, 'cron', second='*/5', id="test_1") # cron 으로 하는 경우는 다음과 같이 파라미터를 상황에 따라 여러개 넣어도 됩니다. # 매시간 59분 10초에 실행한다는 의미. sched.add_job(job_2, 'cron', minute="59", second='10', id="test_10") count = 0 while True: print("Running main process...............") time.sleep(1)
#결과 Running main process............... I'm working... | [time] 9:59:4 I'm working... | [time] 9:59:5 Running main process............... Running main process............... Running main process............... I'm working... | [time] 9:59:7 Running main process............... Running main process............... I'm working... | [time] 9:59:10 Job2 실행: | [time] 9:59:10 Running main process...............
- cron 의 설정에 아래 링크에 자세히 볼 수 있습니다.
http://apscheduler.readthedocs.io/en/3.0/modules/triggers/cron.html#module-apscheduler.triggers.cron
- interval 의 설정은 아래 링크에 자세히 볼 수 있습니다.
다음은 메서드에 파라미터를 받아 실행하는 경우입니다.
# 파라미터를 받아서 실행하는 Job 케이스 def test(test_str, test_str2): print("Hello: %s, %s " % (test_str, test_str2)) # 파라미터를 넣어서 실행하는 경우. # 만약 파라미터를 받는데 넣지 않으면 다음과 같은 에러가 생깁니다.ValueError: The list of positional arguments is longer than the target callable can handle (allowed: 0, given in args: 2) # args 에 값은 반드시 배열로 넣어야 합니다. sched.add_job(test, 'cron', minute="1", second='*/5', id="test_11", args=["테스트", "반가워요"])
apscheduler 의 기능중에는 이미 등록되어 있는 Job 제거 기능이 있습니다.
관련 메서드는 remove_job 입니다.
# 반복문에서 시간이 지나면 job 을 지워주는 코드를 넣어줍니다. count = 0 while True: print("Running main process...............") time.sleep(1) count += 1 if count == 10: sched.remove_job("test_2")
# 결과 I'm working... | [time] 10:5:45 Running main process............... Running main process............... I'm working... | [time] 10:5:46 Running main process............... Running main process............... Running main process............... I'm working... | [time] 10:5:49 I'm working... | [time] 10:5:50 Running main process............... Running main process............... Running main process............... I'm working... | [time] 10:5:52 Running main process............... Running main process............... I'm working... | [time] 10:5:55 Running main process............... Running main process............... Running main process............... Running main process............... Running main process............... I'm working... | [time] 10:6:0 Running main process...............
반응형
'공부 > 프로그래밍' 카테고리의 다른 글
[javascript] React.js 살펴보기 (0) | 2018.05.14 |
---|---|
[github] 깃허브 웹호스트 만들기 (0) | 2018.05.11 |
[python, javascript] 글 속에서 해시태그 추출(python) or 화면에 링크 걸기(javascript) (0) | 2018.04.18 |
[jquery] 무료차트(chart) 추천 - billboard (2) | 2018.04.12 |
[JAVA] 빌더 패턴(Builder Pattern)에 대해 알아보자 (4) | 2018.03.31 |
댓글