Sellerie - Aufgaben-ID für aktuelle Aufgabe abrufen

77

Wie kann ich den Wert task_id für eine Aufgabe aus der Aufgabe heraus abrufen? Hier ist mein Code:

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 ich beim Erstellen einer neuen Instanz der Aufgabe die task_idaus dem Aufgabenobjekt abrufe. Ich benutze dann die Aufgaben-ID, um festzustellen, ob die Aufgabe abgeschlossen ist. Ich nicht will von der Spur der Aufgabe halten pathWert , da die Datei nach dem Ausführen des Tasks wird „gereinigt“, und kann oder auch nicht existieren.

Wie würde ich im obigen Beispiel den Wert von erhalten current_task_id?

Mattbasta
quelle

Antworten:

9

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

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

Die Liste der Standardschlüsselwortargumente ist hier dokumentiert: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

fragtol
quelle
33
Dies ist ab Sellerie 2.2.0 veraltet (siehe Antwort unten).
Simon
122

Seit Sellerie 2.2.0 werden Informationen zur aktuell ausgeführten Aufgabe in gespeichert task.request(es heißt «der Kontext»). Sie sollten also die Aufgaben-ID aus diesem Kontext abrufen (nicht aus veralteten Schlüsselwortargumenten):

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

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

Alex Lokk
quelle
1
Kannst du diese ID außerhalb der Aufgabe bekommen? Führen Sie beispielsweise die Aufgabe aus, rufen Sie die ID ab und überprüfen Sie anhand dieser ID, ob die Aufgabe abgeschlossen ist.
DominiCane
Ja, Sie können die ID von AsyncResult abrufen und dann AsyncResult anhand der ID neu erstellen. Überprüfen Sie die Dokumente docs.celeryproject.org/en/latest/reference/celery.result.html
Alex Lokk
Verwenden Sie Balthazars Antwort, wenn Sie Sellerie 3+ haben. Es ist klarer und unkomplizierter.
Alex Lokk
70

Ab Sellerie 3.1 können Sie das bindDekorationsargument verwenden und haben Zugriff auf die aktuelle Anfrage:

@task(bind=True)
def do_job(self, path):
    cache.set(self.request.id, operation_results)
Balthazar Rouberol
quelle
2
Vielen Dank für die neue Antwort. Funktioniert wie ein Zauber
Oleksandr Dashkov
Kann man auch wissen, ob es sich um eine periodische Aufgabe handelt oder nicht?
PythonEnthusiast