8.8. sched — 事件调度程序 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/sched
跳转至:导航、​搜索

8.8. 计划 — 事件调度器

源代码: :source:`Lib/sched.py`



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

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

例子:

>>> 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 类。

例子:

>>> 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, priority, action, argument)

安排新活动。 time 参数应该是与传递给构造函数的 timefunc 函数的返回值兼容的数字类型。 安排在相同 时间 的事件将按其 优先级 的顺序执行。 较低的数字代表较高的优先级。

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

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

scheduler.enter(delay, priority, action, argument)
延迟 个更多时间单位安排事件。 除相对时间外,其他参数、效果和返回值与enterabs()相同。
scheduler.cancel(event)
从队列中删除事件。 如果 event 不是当前队列中的事件,则此方法将引发 ValueError
scheduler.empty()
如果事件队列为空,则返回 true。
scheduler.run()

运行所有计划的事件。 此函数将等待(使用传递给构造函数的 delayfunc() 函数)下一个事件,然后执行它,依此类推,直到没有更多计划事件。

actiondelayfunc 都可以引发异常。 在任何一种情况下,调度程序都会保持一致的状态并传播异常。 如果 action 引发异常,则在以后对 run() 的调用中不会尝试该事件。

如果一系列事件的运行时间比下一个事件之前可用的时间长,调度程序就会落后。 不会丢弃任何事件; 调用代码负责取消不再相关的事件。

scheduler.queue

只读属性,按运行顺序返回即将发生的事件列表。 每个事件都显示为一个 命名的元组 ,其中包含以下字段:时间、优先级、操作、参数。

2.6 版中的新功能。