Browse Source

Moves the Chord task to built-ins

Ask Solem 13 years ago
parent
commit
4404e26c56
2 changed files with 30 additions and 24 deletions
  1. 27 0
      celery/app/task/builtins.py
  2. 3 24
      celery/task/chords.py

+ 27 - 0
celery/app/task/builtins.py

@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import
 
+from ...utils import uuid
+
 _builtins = []
 
 
@@ -38,6 +40,31 @@ def add_unlock_chord_task(app):
     return unlock_chord
 
 
+@builtin_task
+def add_chord_task(app):
+
+    @app.task(name="celery.chord", accept_magic_kwargs=False)
+    def chord(set, body, interval=1, max_retries=None,
+            propagate=False, **kwargs):
+        from ...task.sets import TaskSet
+
+        if not isinstance(set, TaskSet):
+            set = TaskSet(set)
+        r = []
+        setid = uuid()
+        for task in set.tasks:
+            tid = uuid()
+            task.options.update(task_id=tid, chord=body)
+            r.append(app.AsyncResult(tid))
+        app.backend.on_chord_apply(setid, body,
+                                   interval=interval,
+                                   max_retries=max_retries,
+                                   propagate=propagate,
+                                   result=r)
+        return set.apply_async(taskset_id=setid)
+
+    return chord
+
 def load_builtins(app):
     for constructor in _builtins:
         constructor(app)

+ 3 - 24
celery/task/chords.py

@@ -17,37 +17,16 @@ from ..utils import uuid
 from .sets import TaskSet
 
 
-class Chord(current_app.Task):
-    accept_magic_kwargs = False
-    name = "celery.chord"
-
-    def run(self, set, body, interval=1, max_retries=None,
-            propagate=False, **kwargs):
-        if not isinstance(set, TaskSet):
-            set = TaskSet(set)
-        r = []
-        setid = uuid()
-        for task in set.tasks:
-            tid = uuid()
-            task.options.update(task_id=tid, chord=body)
-            r.append(current_app.AsyncResult(tid))
-        self.backend.on_chord_apply(setid, body,
-                                    interval=interval,
-                                    max_retries=max_retries,
-                                    propagate=propagate,
-                                    result=r)
-        return set.apply_async(taskset_id=setid)
-
-
 class chord(object):
-    Chord = Chord
+    Chord = None
 
     def __init__(self, tasks, **options):
         self.tasks = tasks
         self.options = options
+        self.Chord = self.Chord or current_app.tasks["celery.chord"]
 
     def __call__(self, body, **options):
         tid = body.options.setdefault("task_id", uuid())
         self.Chord.apply_async((list(self.tasks), body), self.options,
                                 **options)
-        return body.type.app.AsyncResult(tid)
+        return body.type.AsyncResult(tid)