2010-07-21 6 views
55

Come posso ottenere il valore task_id per un'attività all'interno del compito? Ecco il mio codice:Sedano - Get compito id per l'attività corrente

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) 

L'idea è che quando creo una nuova istanza del compito, posso recuperare il task_id dall'oggetto compito. Quindi utilizzo l'ID attività per determinare se l'attività è stata completata. I non si desidera tenere traccia dell'attività tramite il valore path poiché il file viene "ripulito" dopo il completamento dell'attività e potrebbe o meno esistere.

Nell'esempio di cui sopra, come faccio a ottenere il valore di current_task_id?

risposta

7

Sedano non impostato alcuni argomenti predefinita di parole chiave se il compito le accetta. (li si può accettare o utilizzando ** kwargs, o elencarle in particolare)

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

La lista degli argomenti a parola chiave default è documentato qui: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

+28

Questo è obsoleto a partire da Celery 2.2.0 (vedere la risposta di seguito). – Simon

96

Dal Sedano 2.2.0, le informazioni relative alla l'attività attualmente eseguita viene salvata su task.request (si chiama «il contesto»). Quindi, si dovrebbe ottenere compito id da questo contesto (non da argomenti chiave, che sono obsoleti):

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

L'elenco di tutti i campi disponibili è documentato qui: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

+0

puoi ottenere questo ID al di fuori del compito? ad esempio, esegui attività, ottieni id e verifica con questo id se l'attività è terminata. – DominiCane

+0

Sì, è possibile ottenere ID da AsyncResult e quindi ricreare AsyncResult dall'ID, controllare i documenti http://docs.celeryproject.org/en/latest/reference/celery.result.html – HighCat

34

Come di sedano 3.1, è possibile utilizzare l'argomento decoratore bind e accedere alla richiesta corrente:

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

Grazie per la nuova risposta . Funziona come un fascino –