파이썬, 스케줄 기능 처리 

 

스케줄러 테스트 예제는 다음과 같다.

import sched, time

s = sched.scheduler(time.time, time.sleep)
count = 0

def do_something(sc):
    global count 
    print(f"반복 실행 중({count} : {time.time()})")
    if count >= 10:
        return 
    count += 1
    s.enter(1, 2, do_something, (sc,))  # 지연: 1, 우선순위: 2     

s.enter(1, 1, do_something, (s,))  # 지연: 1, 우선순위: 1
s.run()

[실행 결과]

반복 실행 중(0 : 1642480089.9239628)
반복 실행 중(1 : 1642480090.9484203)
반복 실행 중(2 : 1642480092.0352113)
반복 실행 중(3 : 1642480093.0628674)
반복 실행 중(4 : 1642480094.087744)
반복 실행 중(5 : 1642480095.1686387)
반복 실행 중(6 : 1642480096.1817787)
반복 실행 중(7 : 1642480097.2075758)
반복 실행 중(8 : 1642480098.2323792)
반복 실행 중(9 : 1642480099.245969)
반복 실행 중(10 : 1642480100.2591379)

 


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

class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
scheduler 클래스는 이벤트 스케줄링을 위한 인터페이스를 정의한다.
스케줄과 관련하여 두 함수를 요구한다
- timefunc는 인자 없이 숫자(시간) 반환하는 함수를 지정한다(예; time.time).
- delayfunc는 한 인자 호출, timefunc 출력과 호환, 그 시간 동안 지연해야 한다.
  delayfunc는 다중 스레드 응용프로그램에서 다른 스레드 실행 기회를 주기 위해
  각 이벤트가 실행된 후 0 인자로 호출되기도 한다.

버전 3.3에서 변경:
timefunc와 delayfunc 매개 변수는 옵션이다.
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)를 실행하는 것을 의미한다.
  argument는 action에 대한 위치 인자가 들어있는 시퀀스이다.
  kwargs는 action에 대한 키워드 인자가 들어있는 딕셔너리이다.
  반환 값은 나중에 이벤트 취소에 사용할 수 있는 이벤트이다(cancel() 참조).
  
  버전 3.3에서 변경:
  argument 매개 변수는 옵션이다.
  kwargs 매개 변수가 추가되었다.

- scheduler.enter(delay, priority, action, argument=(), kwargs={})
  delay 후 이벤트를 예약한다. 이외 다른인자/효과/반환값은 enterabs()와 같다.

  버전 3.3에서 변경:
  argument 매개 변수는 옵션이다.
  kwargs 매개 변수가 추가되었다.

- scheduler.cancel(event)
  큐에서 이벤트를 제거한다.
  event가 큐에 없으면, 이 메서드는 ValueError를 발생시킨다.

- scheduler.empty()
  이벤트 큐가 비어있으면 True를 반환한다.

- scheduler.run(blocking=True)
  예약된 이벤트를 실행한다.
  이 메서드는 다음 이벤트를 (생성자에 전달된 delayfunc() 함수 사용) 기다린 후
  예약된 이벤트가 소진될 때까지 계속 실행한다.
  blocking이 거짓이면 시간이 도래한 (있다면) 예약 이벤트를 모두 실행한 다음,
  스케줄러에서 다음 예약된 호출까지의 (있다면) 대기시간을 반환한다.
  

action/delayfunc는 예외 발생 가능하며 스케줄러는 상태를 유지하고 예외를 전파한다.
action에서 예외가 발생하면, 이후 run() 호출할 때 이벤트를 실행하지 않는다.

일련의 이벤트가 다음 이벤트 이전에 지정 시간보다 오래 걸리면, 스케줄러는 지연된다.
어떤 이벤트도 삭제되지 않는다(부적절한 이벤트 취소 책임은 호출 코드에 있다).

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

- scheduler.queue
남은 이벤트 리스트를 실행될 순서대로 반환한다(읽기 전용 어트리뷰트).
각 이벤트는 다음 필드의 네임드 튜플로 표시된다.
( time, priority, action, argument, kwargs )

반응형

+ Recent posts