파이썬, 스케줄 기능 처리
스케줄러 테스트 예제는 다음과 같다.
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 )
'Python 활용' 카테고리의 다른 글
파이썬, CPU 이용률, 메모리 크기/이용률 출력 (0) | 2022.01.26 |
---|---|
파이썬, JSON <--> 사전 자료 <--> 문자열 구조 변환 (0) | 2022.01.24 |
파이썬, 명령 실행 함수를 subprocess 모듈로 교체하기 (0) | 2022.01.13 |
Python 다중 처리 : 다중 처리 모듈을 사용하여 병렬 코드 실행 (0) | 2022.01.11 |
파이썬, uwsgi 옵션 --master 이용 (0) | 2021.12.29 |