|
@@ -232,10 +232,21 @@ class Scheduler(object):
|
|
|
def is_due(self, entry):
|
|
|
return entry.is_due()
|
|
|
|
|
|
+ def _when(self, entry, next_time_to_run, mktime=time.mktime):
|
|
|
+ adjust = self.adjust
|
|
|
+
|
|
|
+ return (mktime(entry.schedule.now().timetuple()) +
|
|
|
+ (adjust(next_time_to_run) or 0))
|
|
|
+
|
|
|
+ def populate_heap(self, event_t=event_t, heapify=heapq.heapify):
|
|
|
+ """Populate the heap with the data contained in the schedule."""
|
|
|
+ self._heap = [event_t(self._when(e, e.is_due()[1]) or 0, 5, e)
|
|
|
+ for e in values(self.schedule)]
|
|
|
+ heapify(self._heap)
|
|
|
+
|
|
|
# pylint disable=redefined-outer-name
|
|
|
- def tick(self, event_t=event_t, min=min,
|
|
|
- heappop=heapq.heappop, heappush=heapq.heappush,
|
|
|
- heapify=heapq.heapify, mktime=time.mktime):
|
|
|
+ def tick(self, event_t=event_t, min=min, heappop=heapq.heappop,
|
|
|
+ heappush=heapq.heappush):
|
|
|
"""Run a tick - one iteration of the scheduler.
|
|
|
|
|
|
Executes one due task per call.
|
|
@@ -243,17 +254,14 @@ class Scheduler(object):
|
|
|
Returns:
|
|
|
float: preferred delay in seconds for next call.
|
|
|
"""
|
|
|
- def _when(entry, next_time_to_run):
|
|
|
- return (mktime(entry.schedule.now().timetuple()) +
|
|
|
- (adjust(next_time_to_run) or 0))
|
|
|
-
|
|
|
adjust = self.adjust
|
|
|
max_interval = self.max_interval
|
|
|
+
|
|
|
+ if self._heap is None:
|
|
|
+ self.populate_heap()
|
|
|
+
|
|
|
H = self._heap
|
|
|
- if H is None:
|
|
|
- H = self._heap = [event_t(_when(e, e.is_due()[1]) or 0, 5, e)
|
|
|
- for e in values(self.schedule)]
|
|
|
- heapify(H)
|
|
|
+
|
|
|
if not H:
|
|
|
return max_interval
|
|
|
|
|
@@ -265,7 +273,7 @@ class Scheduler(object):
|
|
|
if verify is event:
|
|
|
next_entry = self.reserve(entry)
|
|
|
self.apply_entry(entry, producer=self.producer)
|
|
|
- heappush(H, event_t(_when(next_entry, next_time_to_run),
|
|
|
+ heappush(H, event_t(self._when(next_entry, next_time_to_run),
|
|
|
event[1], next_entry))
|
|
|
return 0
|
|
|
else:
|