|
@@ -212,7 +212,7 @@ class Scheduler(object):
|
|
|
def is_due(self, entry):
|
|
|
return entry.is_due()
|
|
|
|
|
|
- def tick(self, event_t=event_t, min=min,
|
|
|
+ def tick(self, drift=-0.010, event_t=event_t, min=min,
|
|
|
heappop=heapq.heappop, heappush=heapq.heappush,
|
|
|
heapify=heapq.heapify):
|
|
|
"""Run a tick, that is one iteration of the scheduler.
|
|
@@ -223,7 +223,7 @@ class Scheduler(object):
|
|
|
max_interval = self.max_interval
|
|
|
H = self._heap
|
|
|
if H is None:
|
|
|
- H = self._heap = [event_t(e.is_due()[1] or 0, 5, e)
|
|
|
+ H = self._heap = [event_t(e.is_due()[1] + drift or 0, 5, e)
|
|
|
for e in values(self.schedule)]
|
|
|
heapify(H)
|
|
|
event = H[0]
|
|
@@ -239,7 +239,8 @@ class Scheduler(object):
|
|
|
else:
|
|
|
heappush(H, verify)
|
|
|
return min(verify[0], max_interval)
|
|
|
- return min(next_time_to_run or max_interval, max_interval)
|
|
|
+ return min(next_time_to_run + drift if next_time_to_run
|
|
|
+ else max_interval, max_interval)
|
|
|
|
|
|
def should_sync(self):
|
|
|
return (
|
|
@@ -476,7 +477,7 @@ class Service(object):
|
|
|
try:
|
|
|
while not self._is_shutdown.is_set():
|
|
|
interval = self.scheduler.tick()
|
|
|
- if interval:
|
|
|
+ if interval and interval > 0.0:
|
|
|
debug('beat: Waking up %s.',
|
|
|
humanize_seconds(interval, prefix='in '))
|
|
|
time.sleep(interval)
|