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是线程安全的。
下面是一个例子:
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())。
调度一个新事件。time参数应该是一个数字类型,与构造器传入的timefunc函数的返回值兼容。指定到同一个时间的事件调度将按他们的优先级顺序依次执行。
执行时间即为执行action(*argument, **kwargs)。argument是一个序列,按照action的参数顺序排列;kwargs是一个map,使用key对应action的参数。
返回值是一个事件,可以被用于事件的取消(看cancel())。
scheduler.enter(delay, priority, action, argument=(), kwargs={})
在延迟delay时间后调度一个事件。除了使用相对时间,其它的参数和返回值和enterabs是相同的。
在延迟delay时间后调度一个事件。除了使用相对时间,其它的参数和返回值和enterabs是相同的。
scheduler.cancel(event)
从队列中移除事件。如果事件不在当前队列中,该方法抛出ValueError。
从队列中移除事件。如果事件不在当前队列中,该方法抛出ValueError。
scheduler.empty()
如果队列是空的,则返回True。
如果队列是空的,则返回True。
scheduler.run(blocking=True)
运行所有的事件,这个方法将等待(使用传递给构造器的delayfunc()函数)下一个事件的时间到达,然后执行它,直到所有的事件都被执行。
如果blocking为false,则不阻塞等待,立即调度溢出时间的那些时间(如果存在),然后返回在调度器中的下次调度的需要等待的时间,例如:
运行所有的事件,这个方法将等待(使用传递给构造器的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.656073Next表示下一个事件将在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。
将要执行的事件列表,列表只读,事件按照将要执行的顺序排列。每个事件存储为一个元组,包含:time、priority、action、argument和kwargs。
本文详细介绍了Python的sched模块,重点讨论了scheduler类的定义和Scheduler对象的使用,揭示了事件调度的核心机制。
151

被折叠的 条评论
为什么被折叠?



