当前位置: 首页 > 后端技术 > Python

Python事件调度器

时间:2023-03-25 21:43:03 Python

浏览python标准库还好,看到了一个很有意思的模块(sched),非常简短易读。整个模块只有100多行代码加上注释,但是功能还是挺强大的,总结一下分享给大家。简介Python标准库提供了一个sched模块,它定义了一个实现通用事件调度程序的类。在介绍它的用法之前,我们先看看它的源码长什么样。类调度器:def__init__(self,timefunc=_time,delayfunc=time.sleep):self._queue=[]self._lock=threading.RLock()self.timefunc=timefuncself.delayfunc=delayfuncdefenterabs(self,time,priority,action,argument=(),kwargs=_sentinel):passdefenter(self,delay,priority,action,argument=(),kwargs=_sentinel):passdefcancel(self,event):passdefempty(self):passdefrun(self,blocking=True):pass@propertydefqueue(self):pass以上就是它所有的方法和属性,没错,就这么简单,为了预览方便,实现省略了在这里。下面我们一一介绍各个方法和属性。Event在详细介绍这些API之前,先看一下调度器类,内部使用的事件(Event)对象是什么,看定义类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):返回(s.time,s.priority)<=(o.time,o.priority)def__gt__(s,o):返回(s.time,s.priority)>(o.time,o.priority)def__ge__(s,o):返回(s.time,s.priority)>=(o.time,o.priority)其实很简单。主要描述了事件的三个??属性:执行时间(time)优先级(priority)实际要做的事情(action)这里的argument,kwargs是action的位置参数和关键字参数的字典,action(*argument,**kwargs)方法和属性scheduler.enterabs(time,priority,action,argument=(),kwargs={})用于调度一个事件Event,返回Event对象(后面可以用来取消事件,见cancel)time:表示执行的绝对时间,与传递给__init__函数的timefunc函数的返回值兼容;priority:事件的优先级,数字越小,优先级越高;action:事件的动作,即Executeaction(*argument,**kwargs)。scheduler.enter(delay,priority,action,argument=(),kwargs={})调度延迟时间单位延迟的事件。其他参数、效果和返回值与enterabs()相同。scheduler.cancel(event)从队列中移除事件。如果事件不是当前队列中的事件,此方法将引发ValueError异常。scheduler.empty()判断调度事件队列是否为空。scheduler.run(blocking=True)运行所有计划的事件。该方法默认阻塞等待下一个事件的执行,直到没有更多的预定事件。如果一个任务的执行时间大于其他任务的等待时间,那么其他任务会推迟该任务的执行时间,以保证不丢失任何任务,但是这些任务的调用时间会比其他任务延迟设定的时间。如果blocking为False,则执行由于最快到期(如果有)而安排的事件,然后在调度程序中返回下一次安排的调用(如果有)的截止日期。scheduler.queue只读属性按事件运行的顺序返回即将发生的事件的列表。每个事件都表示为具有以下字段的命名元组:时间、优先级、操作、参数、kwargs。我不会在这里给出用例的例子。读者可根据需要自行编写。下面贴出两个例子供参考。