OS: MAC
참고: 👉 점프 투 파이썬 - 라이브러리 예제 바로가기
070. 원하는 작업을 원하는 시간에 실행하려면? ― sched(스케줄)
- 시간을 기준으로 함수 실행을 예약하는 스케줄러 모듈.
- “언제 어떤 함수를 실행할까?”를 등록해두고, run()을 호출하면 순서대로 실행해 줌.
- 유의사항: scheduler.run()은 블로킹(그 함수가 끝날 때까지 그 흐름이 멈춤).
- GUI, 서버 등에서는 threading과 함께 쓰기도 함.(메인 스레드를 잡고 있는 점 주의)
| 구분 | 설명 | 예시 | 결과 |
| 구조 | 기본 사용 흐름 | ① sched.scheduler()로 스케줄러 객체 생성 ② enter() 또는 enterabs()로 작업 등록 ③ run()으로 예약된 작업 실행 |
5초 뒤, 10초 뒤 등 원하는 시점에 함수 실행 |
| scheduler 만들기 | 첫 번째 인자는 “현재 시간을 알려주는 함수”, 두 번째 인자는 “쉬게 만드는 함수” | import sched, time # 기본 패턴 = 현재 시간을 알려주는 함수, 쉬게 만드는 함수 scheduler = sched.scheduler(time.time, time.sleep) |
출력값 없음(정상) 스케줄러 객체 하나 준비 |
| 딜레이 기준 예약 enter() |
“지금으로부터 N초 뒤에 실행해줘” 할 때 사용. 인자: (delay, priority, func, args) |
import sched, time scheduler = sched.scheduler(time.time, time.sleep) def job(name): print("실행!", name, "시간:", time.time()) # 5초 뒤에 job("A") 실행 예약 scheduler.enter(5, 1, job, argument=("A",)) print("시작 시간:", time.time()) scheduler.run() # 실행 후 5초 지나면 job("A") 실행 |
시작 시간: 1763968903.483212 실행! A 시간: 1763968908.485881 |
| 절대 시간 예약 enterabs() |
“유닉스 타임스탬프 T에 실행해줘” 할 때 사용. |
# 정확한 목표 시각에 맞춰 실행 import sched, time scheduler = sched.scheduler(time.time, time.sleep) def job(name): print("실행!", name, "시간:", time.time()) run_at = time.time() + 10 # 지금부터 10초 뒤 시각 scheduler.enterabs(run_at, 1, job, argument=("B",)) print("예약시간:", run_at) print("현재시간:", time.time()) scheduler.run() # 엔터를 한번 더 쳐야 출력값이 보일 수 있음. |
예약시간: 1763969436.3806021 현재시간: 1763969426.380756 실행! B 시간: 1763969436.38307 |
| 여러 작업 예약 & 우선순위 |
여러 개의 작업을 enter()로 등록하면, 시간 기준 → priority 기준으로 정렬해서 실행. priority 숫자가 낮을수록 먼저. | # 같은 시간이라면 B → A 순으로 실행 scheduler.enter(5, 2, job, ("A",)) # 5초 뒤, 우선순위 2 scheduler.enter(5, 1, job, ("B",)) # 5초 뒤, 우선순위 1 scheduler.run() |
실행! A 시간: 1763969596.4616199 실행! B 시간: 1763969596.4617229 |
| 예약 취소 cancel() |
등록한 이벤트(리턴된 event 객체)를 가지고 cancel(event) 하면 실행 전에 취소 가능. | event = scheduler.enter(10, 1, job, ("C",)) # 나중에 조건에 따라 scheduler.cancel(event) |
출력값 없음(정상) # C 작업은 실행되지 않음 |
| 주기적 작업 (loop) | sched 자체에 “매 N초마다” 기능은 없고, job 안에서 다시 예약을 걸어 주기적으로 실행할 수 있음. (일정 간격으로 반복 실행) |
# 파일생성: sched_repeat.py import sched import time scheduler = sched.scheduler(time.time, time.sleep) def periodic_job(name, interval): print(f"[{time.time()}] 주기 작업 실행: {name}") # 다음 실행 예약 scheduler.enter(interval, 1, periodic_job, argument=(name, interval)) if __name__ == "__main__": # 3초 후에 첫 실행, 이후 매번 interval 단위로 계속 재등록 scheduler.enter(3, 1, periodic_job, argument=("HELLO", 3)) # 이 예제는 Ctrl+C 누를 때까지 계속 동작할 수 있음 scheduler.run() # 터미널에서 코드 입력 python3 sched_repeat.py # 종료를 원할 경우, Ctrl+C. 이경우, KeyboardInterrupt 이 출력됨(정상) |
[시간] 주기 작업 실행: HELLO [시간] 주기 작업 실행: HELLO [시간] 주기 작업 실행: HELLO ... 반복 반복 반복... |
라이브러리 예제 문제:


생각보다 어렵다.