Browse Source

PeriodicTasks run_every attribute can now be a timedelta object (if it's an int, it's converted to timedelta(seconds=run_every)

Ask Solem 16 năm trước cách đây
mục cha
commit
7b48860fed
4 tập tin đã thay đổi với 11 bổ sung4 xóa
  1. 2 1
      README.rst
  2. 2 1
      celery/managers.py
  3. 7 1
      celery/task.py
  4. 0 1
      contrib/debian/init.d/celeryd

+ 2 - 1
README.rst

@@ -122,9 +122,10 @@ support extra arguments. Here's an example of a periodic task:
 
 
     >>> from celery.task import tasks, PeriodicTask
+    >>> from datetime import timedelta
     >>> class MyPeriodicTask(PeriodicTask):
     ...     name = "foo.my-periodic-task"
-    ...     run_every = 30 # seconds
+    ...     run_every = timedelta(seconds=30)
     ...
     ...     def run(self, **kwargs):
     ...         logger = self.get_logger(**kwargs)

+ 2 - 1
celery/managers.py

@@ -10,7 +10,8 @@ class PeriodicTaskManager(models.Manager):
         waiting = []
         for task_name, task in periodic_tasks.items():
             task_meta, created = self.get_or_create(name=task_name)
-            run_at = task_meta.last_run_at + timedelta(seconds=task.run_every)
+            # task_run.every must be a timedelta object.
+            run_at = task_meta.last_run_at + task.run_every
             if datetime.now() > run_at:
                 waiting.append(task_meta)
         return waiting

+ 7 - 1
celery/task.py

@@ -3,6 +3,7 @@ from celery.log import setup_logger
 from celery.registry import tasks
 from celery.messaging import TaskPublisher, TaskConsumer
 from django.core.cache import cache
+from datetime import timedelta
 
 
 def delay_task(task_name, **kwargs):
@@ -71,13 +72,18 @@ class Task(object):
 
 
 class PeriodicTask(Task):
-    run_every = 86400
+    run_every = timedelta(days=1)
     type = "periodic"
 
     def __init__(self):
         if not self.run_every:
             raise NotImplementedError(
                     "Periodic tasks must have a run_every attribute")
+
+        # If run_every is a integer, convert it to timedelta seconds.
+        if isinstance(self.run_every, int):
+            self.run_every = timedelta(seconds=self.run_every)
+
         super(PeriodicTask, self).__init__()
 
 

+ 0 - 1
contrib/debian/init.d/celeryd

@@ -92,7 +92,6 @@ case "$1" in
   restart)
 	log_daemon_msg "Restarting celery task worker server" "celeryd"
 	start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $CELERYD_PID_FILE
-	check_for_no_start log_end_msg
 	check_dev_null log_end_msg
 	if start-stop-daemon --start --quiet --oknodo --pidfile $CELERYD_PID_FILE --exec $CELERYD -- $CELERYD_OPTS; then
 	    log_end_msg 0