import heapq import time import threading class Sched: def __init__(self): self.heap = [] self.running = True self.wait_event = threading.Event() def add(self, delay, queue): """Add new execution queue""" heap.heappush((time.time() + delay, delay, queue)) self.wait_event.set() def stop(self): self.running = False self.wait_event.set() def tasks(self): self.running = True # self.wait_event.clear() """Produce events until stopped""" while self.running: runtime, delay, queue = checked_event = self.heap[0] now = time.time() if now < runtime: self.wait(runtime) else : runtime, delay, queue = event = heap.heappop(self.heap) if event is checked_event: try : task = queue.get_nowait() except Empty: pass #XXX else : yield task self.add(delay, queue) def wait(self, timestamp): """Wait until time, may return earlier if internal event occurs (stop, add)""" self.wait_event.wait(timestamp - time.time()) self.wait_event.clear()