没事逛了逛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的阻塞问题