Bladeren bron

Tests passing

Ask Solem 10 jaren geleden
bovenliggende
commit
c73bb64f13
2 gewijzigde bestanden met toevoegingen van 11 en 6 verwijderingen
  1. 9 4
      celery/beat.py
  2. 2 2
      celery/tests/app/test_beat.py

+ 9 - 4
celery/beat.py

@@ -209,10 +209,15 @@ class Scheduler(object):
         else:
             debug('%s sent. id->%s', entry.task, result.id)
 
+    def adjust(self, n, drift=-0.010):
+        if n and n > 0:
+            return n + drift
+        return n
+
     def is_due(self, entry):
         return entry.is_due()
 
-    def tick(self, drift=-0.010, event_t=event_t, min=min,
+    def tick(self, 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.
@@ -220,10 +225,11 @@ class Scheduler(object):
         Executes all due tasks.
 
         """
+        adjust = self.adjust
         max_interval = self.max_interval
         H = self._heap
         if H is None:
-            H = self._heap = [event_t(e.is_due()[1] + drift or 0, 5, e)
+            H = self._heap = [event_t(adjust(e.is_due()[1]) or 0, 5, e)
                               for e in values(self.schedule)]
             heapify(H)
         event = H[0]
@@ -239,8 +245,7 @@ class Scheduler(object):
             else:
                 heappush(H, verify)
                 return min(verify[0], max_interval)
-        return min(next_time_to_run + drift if next_time_to_run
-                   else max_interval, max_interval)
+        return min(adjust(next_time_to_run) or max_interval, max_interval)
 
     def should_sync(self):
         return (

+ 2 - 2
celery/tests/app/test_beat.py

@@ -287,7 +287,7 @@ class test_Scheduler(AppCase):
         scheduler = mScheduler(app=self.app)
         scheduler.add(name='test_pending_tick',
                       schedule=always_pending)
-        self.assertEqual(scheduler.tick(), 1)
+        self.assertEqual(scheduler.tick(), 1 - 0.010)
 
     def test_honors_max_interval(self):
         scheduler = mScheduler(app=self.app)
@@ -303,7 +303,7 @@ class test_Scheduler(AppCase):
                  {'schedule': mocked_schedule(False, j)})
                  for i, j in enumerate(nums))
         scheduler.update_from_dict(s)
-        self.assertEqual(scheduler.tick(), min(nums))
+        self.assertEqual(scheduler.tick(), min(nums) - 0.010)
 
     def test_schedule_no_remain(self):
         scheduler = mScheduler(app=self.app)