scheduler.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import heapq
  2. import time
  3. class Scheduler(object):
  4. def __init__(self, ready_queue):
  5. self.ready_queue = ready_queue
  6. self._queue = []
  7. def enter(self, item, eta=None, priority=0, callback=None):
  8. eta = time.mktime(eta.timetuple()) if eta else time.time()
  9. heapq.heappush(self._queue, (eta, priority, item, callback))
  10. def __iter__(self):
  11. """The iterator yields the time to sleep for between runs."""
  12. # localize variable access
  13. q = self._queue
  14. nowfun = time.time
  15. pop = heapq.heappop
  16. ready_queue = self.ready_queue
  17. while True:
  18. if q:
  19. eta, priority, item, callback = verify = q[0]
  20. now = nowfun()
  21. if now < eta:
  22. yield eta - now
  23. else:
  24. event = pop(q)
  25. print("eta->%s priority->%s item->%s" % (
  26. eta, priority, item))
  27. if event is verify:
  28. ready_queue.put(item)
  29. callback and callback()
  30. yield 0
  31. else:
  32. heapq.heappush(q, event)
  33. yield 1
  34. def empty(self):
  35. return not self._queue
  36. @property
  37. def queue(self):
  38. events = list(self._queue)
  39. return map(heapq.heappop, [events]*len(events))