8.8. sched-事件计划程序

源代码: Lib/sched.py


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

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

Example:

>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(): print "From print_time", time.time()
...
>>> def print_some_times():
...     print time.time()
...     s.enter(5, 1, print_time, ())
...     s.enter(10, 1, print_time, ())
...     s.run()
...     print time.time()
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343700.276

在多线程环境中,scheduler类具有以下方面的限制:线程安全,无法在正在运行的调度程序中当前挂起的任务之前插入新任务以及保持主线程直到事件队列为空。相反,首选方法是改用threading.Timer类。

Example:

>>> import time
>>> from threading import Timer
>>> def print_time():
...     print "From print_time", time.time()
...
>>> def print_some_times():
...     print time.time()
...     Timer(5, print_time, ()).start()
...     Timer(10, print_time, ()).start()
...     time.sleep(11)  # sleep while time-delay events execute
...     print time.time()
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343701.301

8.8.1. 调度程序对象

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

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

执行事件意味着执行action(*argument)。 * argument 必须是一个包含 action *参数的序列。

返回值是一个事件,可用于以后取消该事件(请参见cancel())。

  • scheduler. enter(* delay priority action argument *)

    • 安排一个事件,以“延迟”更多时间单位。除了相对时间,其他参数,效果和返回值与enterabs()相同。
  • scheduler. cancel(* event *)

    • 从队列中删除事件。如果* event *不是队列中当前的事件,则此方法将引发ValueError
  • scheduler. empty ( )

    • 如果事件队列为空,则返回 true。
  • scheduler. run ( )

    • 运行所有计划的事件。此函数将 await(使用传递给构造函数的delayfunc()函数)下一个事件,然后执行该事件,依此类推,直到不再有计划的事件为止。
  • action delayfunc 均可引发异常。无论哪种情况,调度程序都将保持一致的状态并传播异常。如果 action *引发了异常,则将来的对run()的调用将不会try该事件。

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

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

2.6 版的新Function。