2010-07-21 7 views
55

¿Cómo puedo obtener el valor task_id para una tarea dentro de la tarea? Aquí está mi código:Apio: obtenga la identificación de la tarea para la tarea actual

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) 

La idea es que cuando se crea una nueva instancia de la tarea, puedo recuperar el task_id del objeto de tarea. Luego uso la identificación de la tarea para determinar si la tarea se completó. I no desea hacer un seguimiento de la tarea por el valor path porque el archivo se "limpia" después de que la tarea finaliza, y puede o no existir.

En el ejemplo anterior, ¿cómo obtendría el valor de current_task_id?

Respuesta

7

Apio establece algunos argumentos de palabra clave predeterminados si la tarea los acepta. (que puede aceptarlos ya sea usando ** kwargs o enumerarlos específicamente)

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

La lista de argumentos de palabra clave por defecto es documentado aquí: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

+28

Esto está en desuso a partir del apio 2.2.0 (véase la respuesta más abajo). – Simon

96

Desde apio 2.2.0, la información relacionada con la tarea ejecutada actualmente se guarda en task.request (se llama «el contexto»). Lo que debería obtener ID de tarea de este contexto (no de argumentos de palabra clave, que son aprobadas):

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

La lista de todos los campos disponibles está documentado aquí: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

+0

¿Puedes obtener esta identificación fuera de la tarea? por ejemplo ejecutar tarea, obtener ID y verificar con esta identificación si la tarea está terminada. – DominiCane

+0

Sí, puede obtener ID de AsyncResult, y luego volver a crear AsyncResult por id, verifique los documentos http://docs.celeryproject.org/en/latest/reference/celery.result.html – HighCat

34

A partir de apio 3.1, se puede utilizar el argumento decorador bind, y tener acceso a la solicitud actual:

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

Gracias por la nueva respuesta . Funciona de maravilla –

Cuestiones relacionadas