2012-05-03 9 views
9

Ich verwende Django Sellerie mit Redis einige Aufgaben, wie dies auszuführen:django-Sellerie-Akkord verwenden, hält celery.chord_unlock Ausführung immer nicht die bereitgestellte Callback ruft

header = [ 
    tasks.invalidate_user.subtask(args = (user)), 
    tasks.invalidate_details.subtask(args = (user)) 
] 

callback = tasks.rebuild.subtask() 

chord(header)(callback) 

Also im Grunde das gleiche wie in angegeben documentation.

Mein Problem ist, dass, wenn dieser Task-Akkord aufgerufen wird, celery.chord_unlock Aufgabe erneut für immer versucht. Aufgaben in header erfolgreich abgeschlossen, aber wegen chord_unlock nie getan, callback wird nie genannt.

Denke, dass mein Problem darin besteht, nicht erkennen zu können, dass die Aufgaben von header beendet sind, wandte ich mich an Dokumentation, um zu sehen, wie dies angepasst werden kann. Ich habe a section gefunden, die beschreiben, wie die Synchronisation implementiert wird, gibt es ein Beispiel zur Verfügung gestellt, was ich vermisse, ist, wie bekomme ich diese Beispielfunktion aufgerufen werden (d. H. Gibt es ein Signal dafür?).

Weiterhin gibt es eine Notiz, dass diese Methode nicht mit Redis Backend verwendet wird:

Diese von alle Ergebnis Backends außer Redis und Memcached, die nach jeder Aufgabe einen Zähler erhöhen im Header verwendet wird, dann ist die Anwendung Callback, wenn der Zähler die Anzahl der Aufgaben im Set überschreitet.

Aber auch sagt, dass Redis Ansatz besser ist:

Der Redis und Memcached Ansatz ist eine viel bessere Lösung

Welcher Ansatz ist das? Wie wird es umgesetzt?

Also, warum ist chord_unlock nie getan, und wie kann ich es fertige header Aufgaben erkennen lassen?

Ich verwende: Django 1.4, Sellerie 2.5.3, django-Sellerie 2.5.5, redis 2.4.12

Antwort

8

Sie haben nicht ein Beispiel für Ihre Aufgaben haben, aber ich hatte das gleiche Problem und meine Lösung könnte zutreffen.

Ich hatte ignore_result=True auf die Aufgaben, die ich zu einem Akkord hinzugefügt wurde, wie so definiert:

@task(ignore_result=True) 

Offenbar das Ergebnis zu ignorieren macht es so, dass die chord_unlock Aufgabe abgeschlossen, sie sind nicht kennt. Nachdem ich ignore_result entfernt habe (auch wenn die Aufgabe nur wahr zurückgibt), hat der Akkord den Callback richtig aufgerufen.

0

hatte ich den gleichen Fehler, ich den Broker gewechselt RabbitMQ und chord_unlock arbeitet, bis meine Aufgabe beendet (2-3 Minuten Aufgaben)

wenn redis die Aufgabe beendet und chord_unlock mit nur wie 8-10 mal wiederholt alle 1s, also Callback wurde nicht korrekt ausgeführt.

[2012-08-24 16:31:05,804: INFO/MainProcess] Task celery.chord_unlock[5a46e8ac-de40-484f-8dc1-7cf01693df7a] retry: Retry in 1s [2012-08-24 16:31:06,817: INFO/MainProcess] Got task from broker: celery.chord_unlock[5a46e8ac-de40-484f-8dc1-7cf01693df7a] eta:[2012-08-24 16:31:07.815719-05:00]

... just like 8-10 times....

Wechsel Broker für mich gearbeitet, jetzt teste ich @ Chris Lösung und meine Callback-Funktion erhält nie die Ergebnisse aus den Kopf Unteraufgaben: S, so spielt es keine Werke für mich.


Sellerie == 3.0.6

django == 1,4

django-Sellerie == 3.0.6

redis == 2,6

broker: redis-2,4 .16 unter Mac OS X

0

Dies könnte ein Problem verursachen, z. Aus der Dokumentation;

Hinweis:

Wenn Sie Akkorde mit dem Redis Ergebnis Backend verwenden und überschreibt auch die Task.after_return() -Methode, müssen Sie die Akkord-Callback um sicherzustellen, dass die Super-Methode aufrufen oder sonst nicht angewendet werden.

def after_return(self, *args, **kwargs): 
    do_something() 
    super(MyTask, self).after_return(*args, **kwargs) 

Als mein Verständnis, wenn Sie after_return Funktion in Ihrer Aufgabe überschrieben haben, muss sie oder zumindest anrufen Super ein entfernt werden.

Zum Ende des Themas: http://celery.readthedocs.org/en/latest/userguide/canvas.html#important-notes

Verwandte Themen