sched — 事件调度器

源代码: Lib/sched.py


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

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

scheduler 类定义了一个通用的事件调度接口。它需要两个函数来实际处理“外部世界”—— timefunc 应该可以无参数调用,并返回一个数字(“时间”,单位不限)。delayfunc 函数应该可以带一个参数调用,该参数与 timefunc 的输出兼容,并且应该延迟这么多时间单位。在每个事件运行后,delayfunc 也会以参数 0 调用,以允许其他线程在多线程应用程序中运行。

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',))
...     # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
...     s.run()
...     print(time.time())
...
>>> print_some_times()
1652342830.3640375
From print_time 1652342830.3642538 second enterabs
From print_time 1652342830.3643398 first enterabs
From print_time 1652342835.3694863 positional
From print_time 1652342835.3696074 keyword
From print_time 1652342840.369612 default
1652342840.3697174

调度器对象

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

只读属性,返回按执行顺序排列的即将发生的事件列表。每个事件都显示为一个 命名元组,包含以下字段:time, priority, action, argument, kwargs。