1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- import time
- import heapq
- class Scheduler(object):
- def __init__(self, ready_queue):
- self.ready_queue = ready_queue
- self._queue = []
- def enter(self, item, eta=None, priority=0, callback=None):
- eta = time.mktime(eta.timetuple()) if eta else time.time()
- heapq.heappush(self._queue, (eta, priority, item, callback))
- def __iter__(self):
- """The iterator yields the time to sleep for between runs."""
- # localize variable access
- q = self._queue
- nowfun = time.time
- pop = heapq.heappop
- ready_queue = self.ready_queue
- while True:
- if q:
- eta, priority, item, callback = verify = q[0]
- now = nowfun()
- if now < eta:
- yield eta - now
- else:
- event = pop(q)
- print("eta->%s priority->%s item->%s" % (
- eta, priority, item))
- if event is verify:
- ready_queue.put(item)
- callback and callback()
- yield 0
- else:
- heapq.heappush(q, event)
- yield None
- def empty(self):
- return not self._queue
- @property
- def queue(self):
- events = list(self._queue)
- return map(heapq.heappop, [events]*len(events))
|