All pastes #774460 Raw Edit

Someone

public text v1 · immutable
·published 2007-11-15 08:49 UTC
rendered paste body
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()