import time import abc class Timer(object): def __init__(self, name='Timer', listener=None, mode='periodic'): self.name = name self.listener = listener self.isActive = False self.mode = 'periodic' self.interval = 0 self.elapseTime = 0 def start(self, interval): now = time.time() self.interval = interval self.elapseTime = now + interval self.isActive = self.elapseTime > now pass def stop(self): pass def __str__(self): return self.name class TimerListener(abc.ABC): def __init__(self): pass @abc.abstractmethod def onTimer(self, timer): pass class TimerManager(object): def __init__(self): self.timers = [] pass def registerTimer(self, timer): self.timers.append(timer) def process(self): for timer in self.timers: now = time.time() if timer.isActive: if timer.elapseTime <= now: if timer.listener: if 'periodic' in timer.mode: timer.start(timer.interval) timer.listener.onTimer(timer) def getMinTimeout(self): timeouts = [] for timer in self.timers: now = time.time() if timer.isActive: timeout = max(0, timer.elapseTime-now) timeouts.append(timeout) minTimeout = min(timeouts) return minTimeout if __name__ == '__main__': class Test (TimerListener): def __init__(self): self.timerMgr = TimerManager() self.timer200 = Timer('Timer 200', self) self.timer500 = Timer('Timer 500', self) self.timer1000 = Timer('Timer 1000', self) self.timerMgr.registerTimer(self.timer200) self.timerMgr.registerTimer(self.timer500) self.timerMgr.registerTimer(self.timer1000) self.timer200.start(0.200) self.timer500.start(0.500) self.timer1000.start(1.000) pass def onTimer(self, timer): print (timer) def run(self): while(True): wait = self.timerMgr.getMinTimeout() time.sleep(wait) self.timerMgr.process() test = Test() test.run()