sched —事件调度程序

源代码: Lib/sched.py


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

    • class * sched. scheduler(* timefunc = time.monotonic delayfunc = time.sleep *)
    • scheduler类定义用于调度事件的通用接口。它实际上需要两个函数来处理“外部世界” — * timefunc *应该可以不带参数地调用,并返回一个数字(“ time”,以任何单位表示)。 * delayfunc 函数应该可以用一个参数调用,并与 timefunc 的输出兼容,并且应该延迟这么多时间单位。在每个事件运行之后,还将使用参数0调用 delayfunc *,以允许其他线程有机会在多线程应用程序中运行。

在版本 3.3 中更改:* timefunc delayfunc *参数是可选的。

在版本 3.3 中更改:scheduler类可以在多线程环境中安全使用。

Example:

>>> 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 Objects

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

  • scheduler. enterabs(时间优先级动作参数=(),* kwargs ={} *)
    • 安排新活动。 * time 参数应该是与传递给构造函数的 timefunc *函数的返回值兼容的数字类型。安排在相同时间的事件将按其优先级 Sequences 执行。较低的数字表示较高的优先级。

执行事件意味着执行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 *)

    • 运行所有计划的事件。此方法将 await(使用传递给构造函数的delayfunc()函数)下一个事件,然后执行它,依此类推,直到不再有计划的事件为止。

如果* blocking *为 false,则执行计划事件,因为该事件将很快到期(如果有),然后在计划程序中返回下一个计划调用的截止时间(如果有)。

  • action delayfunc 均可引发异常。无论哪种情况,调度程序都将保持一致的状态并传播异常。如果 action *引发了异常,则将来的对run()的调用将不会try该事件。

如果一系列事件花费的时间比下一个事件发生之前的时间长,则调度程序将完全落后。不会删除任何事件;调用代码负责取消不再相关的事件。

在版本 3.3 中更改:添加了* blocking *参数。

  • scheduler. queue
    • 只读属性,按运行 Sequences 返回即将发生的事件的列表。每个事件都显示为named tuple,其中包含以下字段:时间,优先级,操作,参数,kwargs。