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.