2017-12-31 100 views
0

scheduler.run을 호출 한 후 scheduler.enter을 사용하여 이벤트를 스케줄링 할 때 스케줄러를 실행하기 전에 적어도 하나의 이벤트가 발생하기 전에는 이러한 이벤트가 발생하지 않습니다. 이것은 의도 된 것입니까? 당신이 스케줄러를 시작하면python3 sched : run after events()

import sched 
import threading 
import time 

now = time.time() 

scheduler = sched.scheduler(time.time, time.sleep) 


def fire(name): 
    print('EVENT:', name, time.time() - now) 


def start(): 
    t = threading.Thread(target=scheduler.run) 
    t.start() 


################################### 
# when scheduling all before start() everything works as expected. 

# scheduler.enter(4, 1, fire, ('D',)) 
# scheduler.enter(3, 1, fire, ('C',)) 
# scheduler.enter(2, 1, fire, ('B',)) 
# scheduler.enter(1, 1, fire, ('A',)) 
# start() 
# 
# EVENT: A 1.0 
# EVENT: B 2.0 
# EVENT: C 3.0 
# EVENT: D 4.0 

################################### 
# here I'd expect event 'A' to fire after one second. But it is 
# not fired until at least one of the events scheduled before run() 
# is fired. 

# scheduler.enter(2, 1, fire, ('B',)) 
# scheduler.enter(4, 1, fire, ('D',)) 
# start() 
# scheduler.enter(1, 1, fire, ('A',)) 
# scheduler.enter(3, 1, fire, ('C',)) 
# 
# EVENT: A 2.005021572113037 
# EVENT: B 2.005021572113037 
# EVENT: C 3.0050315856933594 
# EVENT: D 4.0050413608551025 

################################### 
# starting before any event is scheduled is not possible, 
# because run() returns directly. 
# 
# start() 
# scheduler.enter(3, 1, fire, ('C',)) 
# scheduler.enter(2, 1, fire, ('B',)) 
# scheduler.enter(1, 1, fire, ('A',)) 
# 
# -- no events fired. 

답변

2

, 그것은 다음 이벤트까지의 지연 시간을 발견하고, 그 값으로 delayfunc (time.sleep())를 호출합니다. delayfunc가 반환 될 때까지는 스케줄러가 더 이상 이벤트를 발생시킬 수 없습니다.

sched 모듈로는이 문제가 발생하지 않습니다. 이 디자인은 새로운 이벤트가 별도의 스레드에서 오는 것이 아니라 기존 이벤트 핸들러에서 추가된다는 아이디어를 기반으로하는 것으로 보입니다 (실제로 Python 3.3까지는 다중 스레드 환경에서의 사용을 지원하지 않았습니다). 새로운 async 항목을 사용하면 더 좋은 방법이 될 수 있지만 특별한 추천은 없습니다.