没事逛了逛python
标准库,看的了一个颇有意思的模块(sched
),十分简短,读起来也比较容易,整个模块加上注释一共才100
多行代码,功能却至关强大,总结出来跟你们分享一下。python
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
)对象是什么,看看定义.net
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)
code
用于安排一个事件Event
,该函数返回Event
的对象(可用于之后取消事件,见cancel
)time
:表示执行的绝对时间,与传递给__init__
函数的timefunc
函数的返回值兼容;priority
:事件的优先级,数字越小表示优先级越高;action
:事件的动做,即执行action(*argument, **kwargs)
。对象
安排延后delay
时间单位的事件。 其余参数、效果和返回值与 enterabs()
的相同。blog
从队列中删除事件。 若是 event
不是当前队列中的事件,则此方法将引起 ValueError
异常。队列
判断调度事件队列是否为空。事件
运行全部预约的事件。此方法默认阻塞等待下一个事件的执行,直到没有更多的计划事件。若是一个任务执行时间大于其余任务的等待时间,那么其余任务会推迟任务的执行时间,这样保证没有任务丢失,但这些任务的调用时间会比设定的推迟。
若是 blocking
为 False
,则执行因为最快到期(若是有)的预约事件,而后在调度程序中返回下一个预约调用的截止时间(若是有)。
只读属性按照将要运行的顺序返回即将发生的事件列表。 每一个事件都显示为 namedtuple
,包含如下字段:time
、priority
、action
、argument
、kwargs
。
这里我就不举例说明了,读者根据须要自行编写,下面贴出两个例子供参考
Python标准库sched模块介绍
python使用多线程threading解决sched的阻塞问题