2010-07-21 11 views
55

Wie kann ich den task_id-Wert für eine Aufgabe innerhalb der Aufgabe abrufen? Hier ist mein Code:Sellerie - Task-ID für aktuelle Aufgabe abrufen

from celery.decorators import task 
from django.core.cache import cache 

@task 
def do_job(path): 
    "Performs an operation on a file" 

    # ... Code to perform the operation ... 

    cache.set(current_task_id, operation_results) 

Die Idee ist, dass, wenn ich eine neue Instanz der Aufgabe zu erstellen, ich habe die task_id aus dem Task-Objekt abzurufen. Ich benutze dann die Task-ID, um festzustellen, ob die Task abgeschlossen wurde. I nicht wollen die Aufgabe durch den Wert path verfolgen, weil die Datei "bereinigt" wird, nachdem die Aufgabe abgeschlossen ist, und möglicherweise nicht vorhanden ist oder nicht.

Im obigen Beispiel, wie würde ich den Wert current_task_id bekommen?

Antwort

7

Sellerie legt einige Standardschlüsselwortargumente fest, wenn die Aufgabe sie akzeptiert. (Sie können sie entweder durch Verwendung ** kwargs akzeptieren, oder sie speziell Liste)

@task 
def do_job(path, task_id=None): 
    cache.set(task_id, operation_results) 

Die Liste der Standard-Schlüsselwort-Argumente ist hier dokumentiert: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

+28

Dies als Sellerie ist veraltet 2.2.0 (siehe Antwort unten). – Simon

96

Da Sellerie 2.2.0 Informationen im Zusammenhang mit Die aktuell ausgeführte Aufgabe wird in task.request gespeichert (sie wird «der Kontext» genannt). So sollten Sie Aufgabe id aus diesem Zusammenhang bekommen (nicht von Keyword-Argumente, die veraltet sind):

@task 
def do_job(path): 
    cache.set(do_job.request.id, operation_results) 

Die Liste aller verfügbaren Felder hier dokumentiert ist: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

+0

Können Sie diese ID außerhalb der Aufgabe erhalten? Zum Beispiel: run task, get ID und check mit dieser ID, wenn die Aufgabe beendet ist. – DominiCane

+0

Ja, Sie können ID von AsyncResult erhalten und dann AsyncResult nach ID neu erstellen, überprüfen Sie die Dokumentation http://docs.selleryproject.org/en/latest/reference/sellery.result.html – HighCat

34

Ab Sellerie 3.1 können Sie verwenden Sie die bind Dekorateur Argument, und haben Zugriff auf die aktuelle Anforderung:

@task(bind=True) 
def do_job(self, path): 
    cache.set(self.request.id, operation_results) 
+0

Vielen Dank für die neue Antwort . Klappt wunderbar –

Verwandte Themen