没事逛了逛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)
其实很简单,主要描述了事件的三个属性:
- 执行时间(
time) - 优先级(
priority) - 实际要做的事情(
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)
运行所有预定的事件。此方法默认阻塞等待下一个事件的执行,直到没有更多的计划事件。如果一个任务执行时间大于其他任务的等待时间,那么其他任务会推迟任务的执行时间,这样保证没有任务丢失,但这些任务的调用时间会比设定的推迟。
如果blocking为False,则执行由于最快到期(如果有)的预定事件,然后在调度程序中返回下一个预定调用的截止时间(如果有)。
-
scheduler.queue
只读属性按照将要运行的顺序返回即将发生的事件列表。 每个事件都显示为namedtuple,包含以下字段:time、priority、action、argument、kwargs。
用例
这里我就不举例说明了,读者根据需要自行编写,下面贴出两个例子供参考
Python标准库sched模块介绍
python使用多线程threading解决sched的阻塞问题