sched --- 이벤트 스케줄러

소스 코드: Lib/sched.py


sched 모듈은 범용 이벤트 스케줄러를 구현하는 클래스를 정의합니다:

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

flowdas

스케줄러 객체는 heapq를 사용합니다. 따라서 개별 이벤트를 등록하고, 실행하는 시간 복잡도는 O(log n) 입니다. 하지만 cancel() 은 최적화되지 않아서, O(log n) 이 가능한데도 O(n) 시간 복잡도를 제공하고 있습니다.

flowdas

스케줄러가 스레드 안전하기는 하지만, run()이 실행 중이고, 다음 이벤트가 실행될 시간이 도래할 때까지 기다리고 있는 상황에서, 다른 스레드에서 이벤트를 등록해도 깨어나지 않습니다.

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',))
...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
...     s.run()
...     print(time.time())
...
>>> print_some_times()
930343690.257
From print_time 930343695.274 positional
From print_time 930343695.275 keyword
From print_time 930343700.273 default
930343700.276

스케줄러 객체

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()와 같습니다.

버전 3.3에서 변경: argument 매개 변수는 선택적입니다.

버전 3.3에서 변경: kwargs 매개 변수가 추가되었습니다.

scheduler.cancel(event)

큐에서 이벤트를 제거합니다. event가 현재 큐에 없으면, 이 메서드는 ValueError를 발생시킵니다.

scheduler.empty()

이벤트 큐가 비어있으면 참을 반환합니다.

scheduler.run(blocking=True)

모든 예약된 이벤트를 실행합니다. 이 메서드는 다음 이벤트를 (생성자에 전달된 delayfunc() 함수를 사용하여) 기다린 다음 예약된 이벤트가 소진될 때까지 계속 실행합니다.

blocking이 거짓이면 시간이 도래한 (있다면) 예약된 이벤트를 모두 실행한 다음, 스케줄러에서 다음 예약된 호출까지의 (있다면) 대기시간을 반환합니다 .

action 이나 delayfunc는 예외를 발생시킬 수 있습니다. 두 경우 모두, 스케줄러는 일관된 상태를 유지하고 예외를 전파합니다. action에 의해 예외가 발생하면, 이후에 run()을 호출할 때 이벤트를 실행하려고 하지 않습니다.

일련의 이벤트가 다음 이벤트 이전에 사용 가능한 시간보다 실행하는 데 더 오래 걸리면, 스케줄러는 단순히 지연됩니다. 어떤 이벤트도 삭제되지 않습니다; 더는 적절하지 않은 이벤트를 취소할 책임은 호출 코드에 있습니다.

버전 3.3에서 변경: blocking 매개 변수가 추가되었습니다.

scheduler.queue

남은 이벤트의 리스트를 실행될 순서대로 반환하는 읽기 전용 어트리뷰트입니다. 각 이벤트는 다음과 같은 필드를 갖는 네임드 튜플로 표시됩니다: time, priority, action, argument, kwargs.

flowdas

이 어트리뷰트는 프로퍼티로 구현되는데, 시간 복잡도는 O(nlog n) 입니다. 아주 비싼 연산이므로 자주 사용하는 용도로는 적합하지 않습니다.