17.6. sched — 事件调度程序 — Python 文档
17.6. 计划 — 事件调度器
sched 模块定义了一个实现通用事件调度器的类:
- class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)
scheduler 类定义了调度事件的通用接口。 它需要两个函数来实际处理“外部世界”——timefunc 应该可以不带参数调用,并返回一个数字(“时间”,任何单位)。 如果 time.monotonic 不可用,则 timefunc 默认为 time.time。 delayfunc 函数应该可以用一个参数调用,与 timefunc 的输出兼容,并且应该延迟那么多时间单位。 delayfunc 也将在每个事件运行后使用参数
0
调用,以允许其他线程有机会在多线程应用程序中运行。3.3 版本更改:timefunc 和 delayfunc 参数是可选的。
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 函数的返回值兼容的数字类型。 安排在相同 时间 的事件将按其 优先级 的顺序执行。 较低的数字代表较高的优先级。
执行事件就是执行
action(*argument, **kwargs)
。 argument 是一个包含 action 的位置参数的序列。 kwargs 是一个包含 action 的关键字参数的字典。返回值是一个事件,可用于稍后取消事件(参见 cancel())。
3.3 版更改:argument 参数是可选的。
3.3 版新功能:添加了 kwargs 参数。
- scheduler.enter(delay, priority, action, argument=(), kwargs={})
为 延迟 个更多时间单位安排事件。 除相对时间外,其他参数、效果和返回值与enterabs()相同。
3.3 版更改:argument 参数是可选的。
3.3 版新功能:添加了 kwargs 参数。
- scheduler.cancel(event)
- 从队列中删除事件。 如果 event 不是当前队列中的事件,则此方法将引发 ValueError。
- scheduler.empty()
- 如果事件队列为空,则返回 true。
- scheduler.run(blocking=True)
运行所有计划的事件。 此方法将等待(使用传递给构造函数的
delayfunc()
函数)下一个事件,然后执行它,依此类推,直到没有更多计划事件。如果 blocking 为 false,则执行由于最快到期的调度事件(如果有),然后在调度程序中返回下一个调度调用的截止日期(如果有)。
action 或 delayfunc 都可以引发异常。 在任何一种情况下,调度程序都会保持一致的状态并传播异常。 如果 action 引发异常,则在以后对 run() 的调用中不会尝试该事件。
如果一系列事件的运行时间比下一个事件之前可用的时间长,调度程序就会落后。 不会丢弃任何事件; 调用代码负责取消不再相关的事件。
3.3 新功能:增加了 blocking 参数。
- scheduler.queue
- 只读属性,按运行顺序返回即将发生的事件列表。 每个事件都显示为一个 命名的元组 ,其中包含以下字段:时间、优先级、操作、参数、kwargs。