Browse Source

Fix task scheduler internal heap building - use of absolute timestamps instead of delays

Alex Koshelev 10 years ago
parent
commit
f4b389d486
1 changed files with 10 additions and 3 deletions
  1. 10 3
      celery/beat.py

+ 10 - 3
celery/beat.py

@@ -222,18 +222,25 @@ class Scheduler(object):
              heapify=heapq.heapify):
         """Run a tick, that is one iteration of the scheduler.
 
-        Executes all due tasks.
+        Executes one due task per call.
 
+        Returns preferred delay in seconds for next call.
         """
+
+        def _when(entry, next_time_to_run):
+            return (time.mktime(entry.schedule.now().timetuple())
+                    + (adjust(next_time_to_run) or 0))
+
         adjust = self.adjust
         max_interval = self.max_interval
         H = self._heap
         if H is None:
-            H = self._heap = [event_t(adjust(e.is_due()[1]) or 0, 5, e)
+            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
+
         event = H[0]
         entry = event[2]
         is_due, next_time_to_run = self.is_due(entry)
@@ -242,7 +249,7 @@ class Scheduler(object):
             if verify is event:
                 next_entry = self.reserve(entry)
                 self.apply_entry(entry, producer=self.producer)
-                heappush(H, event_t(next_time_to_run, event[1], next_entry))
+                heappush(H, event_t(_when(next_entry, next_time_to_run), event[1], next_entry))
                 return 0
             else:
                 heappush(H, verify)