rendered paste body#coding: utf-8from __future__ import with_statementfrom heapq import heappush, heappopfrom time import timefrom threading import Event, Lockimport Queueclass Sched: def __init__(self): self.heap = [] self.running = True self.update_event = Event() self.heap_lock = Lock() def add(self, delay, queue): """Add new execution queue""" with self.heap_lock: heappush(self.heap, (time() + delay, delay, queue)) self.update_event.set() def stop(self): self.running = False self.update_event.set() def tasks(self): self.running = True while self.running: self.update_event.clear() if not len(self.heap): self.update_event.wait() timeout = 0 task = None with self.heap_lock: runtime, delay, queue = self.heap[0] if runtime > time(): timeout = runtime - time() else : heappop(self.heap) try : task = queue.get_nowait() except Queue.Empty: pass # no pushback else : queue.task_done() heappush(self.heap, (time() + delay, delay, queue)) if task: yield task self.update_event.wait(timeout)if __name__ == '__main__': s = Sched() half_sec_q = Queue.Queue() half_sec_q.put(lambda :'foo') half_sec_q.put(lambda :'bar') s.add(0.5, half_sec_q) two_sec_q = Queue.Queue() two_sec_q.put(lambda :'baz') s.add(2, two_sec_q) three_sec_q = Queue.Queue() three_sec_q.put(s.stop) s.add(3, three_sec_q) print time() for value in s.tasks2(): print time(), value()