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?

Antworten:



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


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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.