浏览代码

Make servers drift apart in time for running periodic tasks with the database backend.

Ask Solem 16 年之前
父节点
当前提交
3fe8bce72e
共有 1 个文件被更改,包括 4 次插入0 次删除
  1. 4 0
      celery/managers.py

+ 4 - 0
celery/managers.py

@@ -46,6 +46,9 @@ class TaskManager(models.Manager):
             task.result = result
             task.result = result
             task.save()
             task.save()
 
 
+# server_drift can be negative, but timedelta supports addition on
+#negative seconds.
+server_drift = timedelta(seconds=random.vonmisesvariate(1, 10))
 
 
 class PeriodicTaskManager(models.Manager):
 class PeriodicTaskManager(models.Manager):
     """Manager for :class:`celery.models.PeriodicTask` models."""
     """Manager for :class:`celery.models.PeriodicTask` models."""
@@ -60,6 +63,7 @@ class PeriodicTaskManager(models.Manager):
         for task_name, task in periodic_tasks.items():
         for task_name, task in periodic_tasks.items():
             task_meta, created = self.get_or_create(name=task_name)
             task_meta, created = self.get_or_create(name=task_name)
             # task_run.every must be a timedelta object.
             # task_run.every must be a timedelta object.
+            run_every_drifted = task.run_every + server_drift
             run_at = task_meta.last_run_at + task.run_every
             run_at = task_meta.last_run_at + task.run_every
             if datetime.now() > run_at:
             if datetime.now() > run_at:
                 waiting.append(task_meta)
                 waiting.append(task_meta)