본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 라이브러리 12장 - 동시에 실행하기4 (맥OS 기준) — 시간 기반으로 작업 스케줄링하기 sched

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
...
반복 반복 반복...

라이브러리 예제 문제: 

점프 투 파이썬 - 라이브러리 예제 편 12장 70번 문제
점프 투 파이썬 - 라이브러리 예제 편 12장 70번 문제 풀이 및 결과

 

생각보다 어렵다.