2010-07-21 14 views
55

Jak mogę uzyskać wartość task_id dla zadania z poziomu zadania? Oto mój kod:Selery - Uzyskaj identyfikator zadania dla bieżącego zadania

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) 

Chodzi o to, że gdy tworzę nową instancję zadania, ja odzyskać task_id z obiektu zadania. Następnie używam identyfikatora zadania, aby określić, czy zadanie zostało zakończone. I Nie chcę, aby śledzić zadania przez wartość path, ponieważ plik jest "czyszczone" po zakończeniu zadania i może lub nie może istnieć.

W powyższym przykładzie, w jaki sposób uzyskałabym wartość current_task_id?

Odpowiedz

7

Seler ustawia pewne domyślne argumenty słów kluczowych, jeśli zadanie je zaakceptuje. (można je zaakceptować albo poprzez zastosowanie ** kwargs lub wymienić je specjalnie)

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

Lista domyślnych argumentów słowa kluczowego jest udokumentowane tutaj: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

+28

Jest to przestarzałe od wersji 2.0.0 (zobacz odpowiedź poniżej). – Simon

96

Od Seler 2.2.0, informacje dotyczące aktualnie wykonywane zadanie jest zapisywane w task.request (nazywa się to "kontekstem"). Więc powinieneś dostać identyfikator zadania z tego kontekstu (nie z argumentami słów kluczowych, które są przestarzałe):

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

Lista wszystkich dostępnych pól jest udokumentowane tutaj: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

+0

Czy możesz uzyskać ten identyfikator poza zadaniem? na przykład uruchom zadanie, pobierz id i sprawdź przy pomocy tego id, jeśli zadanie zostało zakończone. – DominiCane

+0

Tak, możesz uzyskać id z AsyncResult, a następnie ponownie utworzyć AsyncResult według id, sprawdź dokumenty http://docs.celeryproject.org/en/latest/reference/celery.result.html – HighCat

34

Jak selera 3.1, można użyj argumentu dekoratora bind i uzyskaj dostęp do bieżącego żądania:

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

Dziękuję za nową odpowiedź . Działa jak marzenie –