La creación de un AsyncResult
objeto 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_started
en 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_started
es False
, que es el valor predeterminado, el estado muestra PENDING
aunque la tarea ha comenzado. Si lo establece task_track_started
en True
, entonces el estado será STARTED
.
El estado PENDING
significa "No sé".
Una AsyncResult
con el estado PENDING
no significa nada más que que Apio desconoce el estado de la tarea. Esto podría deberse a varias razones.
Por un lado, AsyncResult
se 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 AsyncResult
tambié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 AsyncResult
no funcionará en absoluto si task_ignore_result
es así True
. Un problema más irritante es que Celery expira las lápidas por defecto. losresult_expires
La 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 AsyncResult
con ella, el estado será PENDING
.
Todas las "tareas reales" comienzan en el PENDING
estado. Por lo tanto, realizar PENDING
una 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! AsyncResult
no 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
?