import datetime import time
# 定义定时器事件类 class TimedEvent:
def __init__(self, endtime, callback):
'''
初始化方法,存储endtime和callback
:param endtime: callback执行前需要等待的时间
:param callback: 回调函数,即到达执行时间后调用的函数
'''
self.endtime = endtime
self.callback = callback
def ready(self):
'''
判断是否事件已经到达了该执行的适合
:return:
'''
return self.endtime <= datetime.datetime.now()
# 定义定时器类,轮询检测实现任务调度 class Timer: def init(self): ''' 初始化方法,定义一个events列表存储事件 ''' self.events = []
def call_after(self, delay,www.laipuhuo.com callback):
'''
添加新的事件
:param delay: 执行回调方法之前要等待的秒数
:param callback: 回调方法
callback函数应该接收一个参数:执行调用的计时器
:return:
'''
end_time = (datetime.datetime.now() +
datetime.timedelta(seconds=delay))
self.events.append(TimedEvent(end_time, callback))
def run(self):
'''
轮询检测,执行到达执行时间的回调函数
:return:
'''
_# 轮询检测,执行到达执行时间的回调函数_
while True:
_# 使用一个生成器表达式,将将时间已到的事件过滤出来_
ready_events = (e for www.laipuhuo.com e in self.events if e.ready())
_# 按照顺序执行_
for event in ready_events:
event.callback(self)
_# 执行完成后,移除已执行完毕的任务_
self.events.remove(event)
_# 在每次迭代过程中休眠 0.5 秒以防止系统死机_
time.sleep(0.5)
下面,我们编写几个回调函数测试一下:
def format_time(message, *args): ''' 用字符串的 format www.laipuhuo.com 方法将当前时间添加到信息中,并说明变量参数 :param message: 接收任意数量的定位参数 :param args: 用于在函数中处理传递的位置参数序列 :return: None ''' # 当前的时间,格式为:时-分-秒 now = datetime.datetime.now().strftime("%I:%M:%S") # 格式化打印参数 print(message.format(*args, now=now))
# 回调函数:任务一 def Task_One(timer): format_time("{now}: Called Task One")
# 回调函数:任务二 def Task_Two(timer): format_time("{now}: Called Task Two")