2017-12-31 144 views
0

Bei der Planung von Ereignissen mit scheduler.enter nach dem Aufruf von scheduler.run werden diese Ereignisse ausgelöst, bis mindestens ein Ereignis, das vor dem Ausführen des Schedulers eingegeben wurde, ausgelöst wurde. Ist das beabsichtigt?python3 sched: Ereignisse nach Ausführung planen()

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. 

Antwort

2

Wenn Sie den Scheduler starten, findet er die Verzögerung bis zum nächsten Ereignis und ruft die delayfunc (time.sleep()) mit diesem Wert. Bis die delayfunc zurückkommt, kann der Scheduler keine weiteren Ereignisse auslösen.

Ich sehe keine andere Möglichkeit mit dem sched Modul. Sein Design scheint auf der Idee zu beruhen, dass neue Ereignisse von den Handlern existierender Ereignisse hinzugefügt werden, anstatt von einem separaten Thread zu kommen (tatsächlich hat es nicht einmal die Verwendung in einer Multithread-Umgebung bis Python 3.3 unterstützt). Es gibt wahrscheinlich einen besseren Weg, dies mit den neuen async Sachen zu tun, aber ich habe keine besondere Empfehlung.

Verwandte Themen