rendered paste bodyimport 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()