Skip to main content

17.6. sched —事件调度器

源代码: Lib/sched.py


sched 模块定义了一个实现通用事件调度器的类:

class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)

scheduler 类定义了用于调度事件的通用接口。它需要两个功能来实际处理“外部世界”— timefunc 应该是可调用无参数,并返回一个数字(“时间”,无论任何单位)。如果time.monotonic不可用,则 timefunc 默认值为time.time。 delayfunc 函数应该可调用一个参数,与 timefunc 的输出兼容,并应该延迟许多时间单位。在每个事件运行后,还将使用参数 0 调用 delayfunc,以允许其他线程有机会在多线程应用程序中运行。

在 3.3 版更改: timefuncdelayfunc 参数为可选参数。

在 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

17.6.1. 调度程序对象

scheduler 实例具有以下方法和属性:

scheduler.enterabs(time, priority, action, argument=(), kwargs={})

安排新活动。 time 参数应该是与传递给构造函数的 timefunc 函数的返回值兼容的数字类型。针对相同 time 安排的事件将按照其 priority 的顺序执行。

执行事件意味着执行 action(*argument, **kwargs)argument 是一个包含 action 的位置参数的序列。 kwargs 是一个包含 action 的关键字参数的字典。

返回值是可用于稍后取消事件的事件(请参阅 cancel())。

在 3.3 版更改: argument 参数是可选的。

3.3 新版功能: 添加了 kwargs 参数。

scheduler.enter(delay, priority, action, argument=(), kwargs={})

delay 安排一个事件更多的时间单位。除了相对时间,其他参数,效果和返回值与 enterabs() 的相同。

在 3.3 版更改: argument 参数是可选的。

3.3 新版功能: 添加了 kwargs 参数。

scheduler.cancel(event)

从队列中删除事件。如果 event 不是队列中当前的事件,则此方法将产生 ValueError

scheduler.empty()

如果事件队列为空,则返回true。

scheduler.run(blocking=True)

运行所有计划的事件。此方法将等待(使用传递给构造函数的 delayfunc() 函数)下一个事件,然后执行它,依此类推,直到没有更多的调度事件。

如果 blocking 为false,则执行预定事件,由于到期最早(如果有),然后返回调度器中下一个调度的调用的最后期限(如果有的话)。

actiondelayfunc 都可能引发异常。在任一情况下,调度程序将保持一致的状态并传播异常。如果 action 引发了异常,则不会在未来调用 run() 时尝试该事件。

如果事件序列比下一个事件之前可用的时间运行时间更长,则调度器将简单地落后。没有事件将被丢弃;调用代码负责取消不再相关的事件。

3.3 新版功能: 添加了 blocking 参数。

scheduler.queue

只读属性以它们将要运行的顺序返回即将到来的事件的列表。每个事件都显示为 named tuple,其中包含以下字段:时间,优先级,操作,参数,kwargs。