# 17.6. `sched` - 事件调度程序

源代码： Lib / sched.py

`sched`模块定义了实现通用事件调度器的类：

class `sched.``scheduler`(timefunc=time.monotonic, delayfunc=time.sleep)

  `scheduler`类定义了调度事件的通用接口。它需要两个函数实际地处理“外部世界” - timefunc是无参数调用，并返回一个数字（“时间”，无论任何单位）。如果time.monotonic不可用，则timefunc默认值为time.time。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',))
    ...     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 Objects

`scheduler`实例具有以下方法和属性：

`scheduler.``enterabs`(time, priority, action, argument=(), kwargs={})

  安排新活动。时间参数应为与传递给构造函数的timefunc函数的返回值兼容的数字类型。为相同时间安排的活动将按照优先级的顺序执行。

  执行事件意味着执行`action（* argument， ** kwargs）`。参数是包含动作的位置参数的序列。kwargs是一个包含动作的关键字参数的字典。

  返回值是可用于稍后取消事件的事件（请参见`cancel()`）。

  在版本3.3中更改： 参数参数是可选的。

  版本3.3中新增： kwargs参数已添加。

`scheduler.``enter`(delay, priority, action, argument=(), kwargs={})

  安排延迟更多时间单位的事件。除了相对时间，其他参数，效果和返回值与`enterabs()`的相同。

  在版本3.3中更改： 参数参数是可选的。

  版本3.3中新增： kwargs参数已添加。

`scheduler.``cancel`(event)

  从队列中删除事件。如果事件不是队列中当前的事件，则此方法将引发`ValueError`。

`scheduler.``empty`()

  如果事件队列为空，则返回true。

`scheduler.``run`(blocking=True)

  运行所有计划的事件。这个方法将等待（使用传递给构造函数的`delayfunc()`函数）下一个事件，然后执行它，直到没有更多的调度事件。

  如果阻塞为false，则执行预定事件（由于到期最快（如果有）），然后返回调度程序中下一个调度的调用的最后期限（如果有）。

  动作或delayfunc可引发异常。在任一情况下，调度程序将保持一致的状态并传播异常。如果action引发异常，则在未来调用`run()`时不会尝试该事件。

  如果事件序列比下一个事件之前可用的时间运行时间更长，则调度器将会落后。没有事件将被丢弃；调用代码负责取消不再相关的事件。

  版本3.3中的新功能：添加了阻止参数。

`scheduler.``queue`

  只读属性以它们将要运行的顺序返回即将到来的事件的列表。每个事件都显示为named tuple，其中包含以下字段：time，priority，action，argument，kwargs。