sched
— 事件调度器¶
源代码: Lib/sched.py
sched
模块定义了一个实现通用事件调度器的类。
- class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)¶
scheduler
类定义了调度事件的通用接口。它需要两个函数来实际处理“外部世界”—— timefunc 应该在没有参数的情况下可调用,并返回一个数字(“时间”,以任何单位)。 delayfunc 函数应该可以使用一个参数调用,该参数与 timefunc 的输出兼容,并且应该延迟那么多时间单位。在每个事件运行后,也会使用参数0
调用 delayfunc,以便在多线程应用程序中为其他线程提供运行的机会。在 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',))
... # 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,则执行即将到期的已安排事件(如果有),然后返回调度程序中下一个已安排调用的截止时间(如果有)。
action 或 delayfunc 都可以引发异常。在任何一种情况下,调度程序都将保持一致的状态并传播异常。如果 action 引发异常,则在以后调用
run()
时,将不会尝试该事件。如果一系列事件的运行时间超过下一个事件之前的可用时间,则调度程序将 simplemente 落后。不会丢弃任何事件;调用代码负责取消不再相关的事件。
在 3.3 版更改: 添加了 blocking 参数。