self.events.append(TimedEvent(www.laipuhuo.com end_time, callback))

50 阅读1分钟

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")