Python事件调度器

没事逛了逛python标准库,看的了一个很有意思的模块(sched),十分简短,读起来也比较容易,整个模块加上注释一共才100多行代码,功能却相当强大,总结出来跟大家分享一下。

介绍

python标准库提供了一个sched 模块,它定义了一个实现通用事件调度程序的类。在介绍其用法之前,我们先看一眼它的源码是什么样子。

class scheduler:
    def __init__(self, timefunc=_time, delayfunc=time.sleep):
        self._queue = []
        self._lock = threading.RLock()
        self.timefunc = timefunc
        self.delayfunc = delayfunc

    def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel):
        pass

    def enter(self, delay, priority, action, argument=(), kwargs=_sentinel):
        pass

    def cancel(self, event):
        pass

    def empty(self):
        pass

    def run(self, blocking=True):
        pass

    @property
    def queue(self):
        pass

上面是它所有的方法和属性了,没错,就这么简洁,为了方便预览,这里把实现给省略了。下面我们逐一介绍各个方法和属性。

  • 事件

在详细介绍这些API之前,我先看一看scheduler类,内部用到的事件(Event)对象是什么,看看定义

class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')):
    __slots__ = []
    def __eq__(s, o): return (s.time, s.priority) == (o.time, o.priority)
    def __lt__(s, o): return (s.time, s.priority) <  (o.time, o.priority)
    def __le__(s, o): return (s.time, s.priority) <= (o.time, o.priority)
    def __gt__(s, o): return (s.time, s.priority) >  (o.time, o.priority)
    def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority)

其实很简单,主要描述了事件的三个属性:

  1. 执行时间(time
  2. 优先级(priority
  3. 实际要做的事情(action

这里的argument, kwargs是动作的位置参数和关键字参数的字典,action(*argument, **kwargs)

方法和属性

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

用于安排一个事件Event,该函数返回Event的对象(可用于以后取消事件,见cancel
time:表示执行的绝对时间,与传递给__init__函数的timefunc函数的返回值兼容;
priority:事件的优先级,数字越小表示优先级越高;
action:事件的动作,即执行action(*argument, **kwargs)

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

安排延后delay时间单位的事件。 其他参数、效果和返回值与 enterabs()的相同。

  • scheduler.cancel(event)

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

  • scheduler.empty()

判断调度事件队列是否为空。

  • scheduler.run(blocking=True)

运行所有预定的事件。此方法默认阻塞等待下一个事件的执行,直到没有更多的计划事件。如果一个任务执行时间大于其他任务的等待时间,那么其他任务会推迟任务的执行时间,这样保证没有任务丢失,但这些任务的调用时间会比设定的推迟。
如果 blockingFalse ,则执行由于最快到期(如果有)的预定事件,然后在调度程序中返回下一个预定调用的截止时间(如果有)。

  • scheduler.queue

只读属性按照将要运行的顺序返回即将发生的事件列表。 每个事件都显示为 namedtuple ,包含以下字段:timepriorityactionargumentkwargs

用例

这里我就不举例说明了,读者根据需要自行编写,下面贴出两个例子供参考
Python标准库sched模块介绍
python使用多线程threading解决sched的阻塞问题

你可能感兴趣的