La creación de un AsyncResultobjeto a partir de la identificación de la tarea es la forma recomendada en las Preguntas frecuentes para obtener el estado de la tarea cuando lo único que tiene es la identificación de la tarea.
Sin embargo, a partir de Celery 3.x, existen advertencias importantes que podrían morder a las personas si no les prestan atención. Realmente depende del escenario de caso de uso específico.
De forma predeterminada, Apio no registra un estado "en ejecución".
Para que Celery registre que se está ejecutando una tarea, debe establecer task_track_starteden True. Aquí hay una tarea simple que prueba esto:
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
Cuando task_track_startedes False, que es el valor predeterminado, el estado muestra PENDINGaunque la tarea ha comenzado. Si lo establece task_track_starteden True, entonces el estado será STARTED.
El estado PENDINGsignifica "No sé".
Una AsyncResultcon el estado PENDINGno significa nada más que que Apio desconoce el estado de la tarea. Esto podría deberse a varias razones.
Por un lado, AsyncResultse puede construir con identificadores de tareas no válidos. Dichas "tareas" serán consideradas pendientes por Celery:
>>> task.AsyncResult("invalid").status
'PENDING'
De acuerdo, nadie va a proporcionar identificadores obviamente inválidos AsyncResult. Bastante justo, pero también tiene como efecto que AsyncResulttambién considerará una tarea que se ha ejecutado con éxito pero que Celery ha olvidado como PENDING. Nuevamente, en algunos escenarios de casos de uso esto puede ser un problema. Parte del problema depende de cómo se configura Celery para mantener los resultados de las tareas, porque depende de la disponibilidad de las "lápidas" en el backend de resultados. ("Tombstones" es el término que se usa en la documentación de Celery para los fragmentos de datos que registran cómo terminó la tarea). El uso AsyncResultno funcionará en absoluto si task_ignore_resultes así True. Un problema más irritante es que Celery expira las lápidas por defecto. losresult_expiresLa configuración predeterminada está establecida en 24 horas. Entonces, si inicia una tarea y registra la identificación en el almacenamiento a largo plazo, y más 24 horas después, crea una AsyncResultcon ella, el estado será PENDING.
Todas las "tareas reales" comienzan en el PENDINGestado. Por lo tanto, realizar PENDINGuna tarea podría significar que se solicitó la tarea, pero nunca avanzó más allá de esto (por cualquier motivo). O podría significar que la tarea se ejecutó pero Celery olvidó su estado.
¡Ay! AsyncResultno funcionará para mí. ¿Que más puedo hacer?
Prefiero realizar un seguimiento de los objetivos que realizar un seguimiento de las tareas en sí . Conservo cierta información sobre las tareas, pero en realidad es secundaria al seguimiento de los objetivos. Las porterías se almacenan en almacenamiento independiente del apio. Cuando una solicitud necesita realizar un cálculo depende de que se haya logrado algún objetivo, verifica si el objetivo ya se ha logrado, en caso afirmativo, utiliza este objetivo almacenado en caché, de lo contrario, inicia la tarea que afectará el objetivo y envía a el cliente que hizo la solicitud HTTP una respuesta que indica que debe esperar un resultado.
Los nombres de variables y los hipervínculos anteriores son para Celery 4.x. En 3.x las variables y los enlaces correspondientes son los siguientes: CELERY_TRACK_STARTED, CELERY_IGNORE_RESULT, CELERY_TASK_RESULT_EXPIRES.
x?