sched模块提供了一个用于事件调度的类。
scheduler类定义
class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
scheduler类为事件调度定义了一套通用接口。它需要传入两个函数:1)timefunc是一个没有参数的callable,并且返回一个一个数字(表示“时间”,任意单位)。如果time.monotonic不是可用的,则默认为time.time。2)delayfunc是带有一个参数的callable,与timefunc的输出兼容,用于延迟一段时间。在多线程应用中,为了给其它线程执行的机会,在每个事件执行后,delayfunc也将使用参数0调用。
从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实例有以下方法和属性:
scheduler.enterabs(time, priority, action, argument=(), kwargs={})
调度一个新事件。time参数应该是一个数字类型,与构造器传入的timefunc函数的返回值兼容。指定到同一个时间的事件调度将按他们的优先级顺序依次执行。
执行时间即为执行action(*argument, **kwargs)。argument是一个序列,按照action的参数顺序排列;kwargs是一个map,使用key对应action的参数。
返回值是一个事件,可以被用于事件的取消(看cancel())。
scheduler.enter(delay, priority, action, argument=(), kwargs={})
在延迟delay时间后调度一个事件。除了使用相对时间,其它的参数和返回值和enterabs是相同的。
scheduler.cancel(event)
从队列中移除事件。如果事件不在当前队列中,该方法抛出ValueError。
scheduler.empty()
如果队列是空的,则返回True。
scheduler.run(blocking=True)
运行所有的事件,这个方法将等待(使用传递给构造器的delayfunc()函数)下一个事件的时间到达,然后执行它,直到所有的事件都被执行。
如果blocking为false,则不阻塞等待,立即调度溢出时间的那些时间(如果存在),然后返回在调度器中的下次调度的需要等待的时间,例如:
>>> 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'}) print("Next : ",s.run(False)) print(time.time())
第一次调用:
>>> print_some_times() 1435115632.601069 Next : 5.0 1435115632.656073
Next表示下一个事件将在5秒后执行。第二次超过10秒后调用:
>>> print_some_times() 1435115665.549954 From print_time 1435115665.596957 keyword From print_time 1435115665.607957 positional From print_time 1435115665.618958 default Next : 4.966997861862183 1435115665.635959
这时事件已经全部达到执行时间点,所以全部立即执行。
action后者delayfunc能抛出一个异常,这时,调度器将保持一致并传递该异常。如果异常被action抛出,以后该事件将不会再被执行。
如果一个事件执行的结束时间超过了下一个事件的执行时间,调度器将忽略下一个事件。没有事件会被丢弃。
scheduler.queue
将要执行的事件列表,列表只读,事件按照将要执行的顺序排列。每个事件存储为一个元组,包含:time、priority、action、argument和kwargs。