`sched` — 이벤트 스케줄러

sched — 이벤트 스케줄러

sched 모듈은 범용 이벤트 스케줄러를 구현하는 클래스를 정의해요.

class sched.scheduler(*timefunc=time.monotonic*, *delayfunc=time.sleep*)

scheduler 클래스는 이벤트를 스케줄링하는 일반적인 인터페이스를 정의해요. "외부 세계"를 실제로 다루려면 두 함수가 필요해요. timefunc는 인자 없이 호출 가능해야 하고 숫자(어떤 단위든 "시간")를 반환해야 해요. delayfunc 함수는 timefunc의 출력과 호환되는 인자 하나로 호출 가능해야 하고, 그만큼의 시간 단위를 지연시켜야 해요. delayfunc는 각 이벤트가 실행된 후에도 인자 0으로 호출되어, 멀티스레드 애플리케이션에서 다른 스레드가 실행될 기회를 갖게 해요.

  • 버전 3.3 변경: timefuncdelayfunc 인자가 선택 사항이 됨.
  • 버전 3.3 변경: scheduler 클래스가 멀티스레드 환경에서 안전하게 쓸 수 있게 됨.

예시:

>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(a='default'):
...     print("From print_time", time.time(), a)
...
>>> def print_some_times():
...     print(time.time())
...     s.enter(10, 1, print_time)
...     s.enter(5, 2, print_time, argument=('positional',))
...     # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
...     s.run()
...     print(time.time())
...
>>> print_some_times()
1652342830.3640375
From print_time 1652342830.3642538 second enterabs
From print_time 1652342830.3643398 first enterabs
From print_time 1652342835.3694863 positional
From print_time 1652342835.3696074 keyword
From print_time 1652342840.369612 default
1652342840.3697174

Scheduler 객체

scheduler 인스턴스에는 다음 메서드와 속성이 있어요.

scheduler.enterabs(*time*, *priority*, *action*, *argument=()*, *kwargs={}*)

새 이벤트를 스케줄해요. time 인자는 생성자에 넘긴 timefunc 함수의 반환 값과 호환되는 숫자 타입이어야 해요. 같은 time으로 스케줄된 이벤트는 priority 순서로 실행돼요. 숫자가 낮을수록 우선순위가 높아요.

이벤트 실행은 action(*argument, **kwargs)를 실행하는 걸 뜻해요. argumentaction의 위치 인자를 담은 시퀀스이고, kwargsaction의 키워드 인자를 담은 사전이에요.

반환 값은 이후 이벤트 취소(앞의 cancel() 참고)에 쓸 수 있는 이벤트예요.

  • 버전 3.3 변경: argument 인자가 선택 사항이 됨.
  • 버전 3.3 변경: kwargs 인자 추가.

scheduler.enter(*delay*, *priority*, *action*, *argument=()*, *kwargs={}*)

delay만큼의 시간 단위 뒤에 실행할 이벤트를 스케줄해요. 상대 시간만 빼면 다른 인자, 효과, 반환 값은 enterabs()와 같아요.

scheduler.cancel(*event*)

큐에서 이벤트를 제거해요. event가 현재 큐에 없는 이벤트라면 ValueError를 발생시켜요.

scheduler.empty()

이벤트 큐가 비어 있으면 True를 반환해요.

scheduler.run(*blocking=True*)

모든 스케줄된 이벤트를 실행해요. 이 메서드는 (생성자에 넘긴 delayfunc 함수로) 다음 이벤트까지 기다렸다가 실행하고, 스케줄된 이벤트가 더 이상 없을 때까지 계속해요.

blocking이 거짓이면, 현재 timefunc 값보다 작거나 같은 시간 값을 가진 큐의 모든 이벤트(있을 경우)를 즉시 실행하고, 현재 timefunc 값과 스케줄러 이벤트 큐의 다음 스케줄 이벤트 시간 값 사이의 차이를 반환해요. 큐가 비어 있으면 None을 반환해요.

action이나 delayfunc가 예외를 발생시킬 수 있어요. 어느 쪽이든 스케줄러는 일관된 상태를 유지하고 예외를 전파해요. action이 예외를 발생시키면 그 이벤트는 이후 run() 호출에서 다시 시도되지 않아요.

이벤트 시퀀스가 다음 이벤트까지의 시간보다 오래 걸리면 스케줄러는 그냥 뒤처져요. 어떤 이벤트도 버려지지 않으며, 더 이상 관련이 없는 이벤트를 취소하는 건 호출 코드의 책임이에요.

  • 버전 3.3 변경: blocking 인자 추가.

scheduler.queue

실행될 순서대로 다가오는 이벤트 목록을 반환하는 읽기 전용 속성이에요. 각 이벤트는 time, priority, action, argument, kwargs 필드를 가진 named tuple로 표시돼요.

더 알아보기

  • time 모듈의 모노토닉 시계(time.monotonic)와 time.sleep.