AsyncResult (task_id) devuelve el estado “PENDIENTE” incluso después de que se inició la tarea

En el proyecto, trato de sondear task.state de una tarea de larga ejecución y actualizar su estado de ejecución. Funcionó en el desarrollo, pero no funcionará cuando muevo el proyecto al servidor de producción. Seguí recibiendo “PENDIENTES”, incluso cuando veo que la tarea comenzó en la flor. Sin embargo, todavía puedo obtener los resultados actualizados cuando finalizó la tarea, que cuando task.state == ‘SUCCESS’. Uso Python 2.6, Django 1.6 y Celery 3.1 en la producción, resultado del backend AMQP.

@csrf_exempt def poll_state(request): data = 'Fail' if request.is_ajax(): if 'task_id' in request.POST.keys() and request.POST['task_id']: task_id = request.POST['task_id'] email = request.POST['email'] task = AsyncResult(task_id) print "task.state=", task.state if task.state == 'STARTED': task_state = 'Running' data = 'Running' #data = 'Running' elif task.state == 'PENDING' or task.state == 'RETRY': task_state = 'Waiting' data = 'Pending' elif task.state == 'SUCCESS': task_state = 'Finished' if task.result: data = task.result else: data = 'None' else: task_state = task.state data = 'Error' print 'data status =', task_state else: task_state = task.state data = 'Error' else: task_state = task.state data = "Error" json_data = json.dumps({'task_state':task_state, 'task_data':data}) return HttpResponse(json_data, mimetype='application/json') 

en otra nota, flower siempre muestra el estado de los trabajadores fuera de línea, pero el estado de las tareas era correcto. Cuando se usan los eventos de apio 3.1.12 (Cipater), muestra el estado correcto del trabajador.

Probablemente esté relacionado con la configuración de CELERY_TRACK_STARTED . Citando los documentos:

CELERY_TRACK_STARTED

Si es Verdadero, la tarea informará su estado como “iniciado” cuando la tarea es ejecutada por un trabajador. El valor predeterminado es False, ya que el comportamiento normal es no informar ese nivel de granularidad. Las tareas están pendientes, finalizadas o en espera de ser reintentadas. Tener un estado de “inicio” puede ser útil cuando hay tareas de larga ejecución y es necesario informar qué tarea se está ejecutando actualmente.

¿Quizás tiene CELERY_TRACK_STARTED = True en sus configuraciones de desarrollo, pero no en producción?

Para Celery 4.1.0 y Django 1.11.7 esto es lo que necesita en el archivo config.py:

Correcto:

 task_track_started = True 

También correcto:

 CELERY_TASK_TRACK_STARTED = True 

¡INCORRECTO!:

 CELERY_TRACK_STARTED = True 

Sólo me tomó 2 horas para averiguarlo. Espero que esto sirva a alguien en un futuro cercano.