¿Cómo se comprueba si una tarea se está ejecutando en apio (específicamente, estoy usando celery-django)?
Leí la documentación y busqué en Google, pero no puedo ver una llamada como:
my_example_task.state() == RUNNING
Mi caso de uso es que tengo un servicio externo (java) para la transcodificación. Cuando envío un documento para que sea transcodificado, quiero verificar si la tarea que ejecuta ese servicio se está ejecutando y, de no ser así, (re) iniciarla.
Estoy usando las versiones estables actuales - 2.4, creo.
python
web-services
celery
django-celery
Marcin
fuente
fuente
x
?async_result
. En su caso de uso, ya tiene la instancia, está listo para comenzar. Pero, ¿qué sucede si solo tiene la identificación de la tarea y necesita crear unaasync_result
instancia para poder llamarasync_result.get()
? Esta es una instancia de laAsyncResult
clase, pero no puede usar la clase sin formatocelery.result.AsyncResult
, debe obtener la clase de la función envuelta porapp.task()
. En tu caso lo haríasasync_result = run_instance.AsyncResult('task-id')
but you cannot use the raw class celery.result.AsyncResult, you need to get the class from the function wrapped by app.task().
- Creo que así es como se suponía que debía usarse. Lea el código: github.com/celery/celery/blob/…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
enTrue
. Aquí hay una tarea simple que prueba esto:Cuando
task_track_started
esFalse
, que es el valor predeterminado, el estado muestraPENDING
aunque la tarea ha comenzado. Si lo establecetask_track_started
enTrue
, entonces el estado seráSTARTED
.El estado
PENDING
significa "No sé".Una
AsyncResult
con el estadoPENDING
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:De acuerdo, nadie va a proporcionar identificadores obviamente inválidos
AsyncResult
. Bastante justo, pero también tiene como efecto queAsyncResult
también considerará una tarea que se ha ejecutado con éxito pero que Celery ha olvidado comoPENDING
. 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 usoAsyncResult
no funcionará en absoluto sitask_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 unaAsyncResult
con ella, el estado seráPENDING
.Todas las "tareas reales" comienzan en el
PENDING
estado. Por lo tanto, realizarPENDING
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
.fuente
Cada
Task
objeto tiene una.request
propiedad que lo contieneAsyncRequest
. En consecuencia, la siguiente línea muestra el estado de una tareatask
:fuente
También puede crear estados personalizados y actualizar su valor según la ejecución de la tarea. Este ejemplo es de docs:
http://celery.readthedocs.org/en/latest/userguide/tasks.html#custom-states
fuente
Antigua pregunta, pero recientemente me encontré con este problema.
Si está intentando obtener el task_id, puede hacerlo así:
Ahora sabe exactamente qué es task_id y ahora puede usarlo para obtener AsyncResult:
fuente
apply_async
. El objeto devuelto porapply_async
es unAsyncResult
objeto, que tiene el id de la tarea que generó Celery.task_id
requiere que genere una identificación de tarea usted mismo. En su comentario, ha imaginado una razón que va más allá de "cómo verifico el estado de la tarea" y "Si está tratando de obtener el task_id ..." Genial si tiene esa necesidad, pero no es el caso aquí. (Además, usaruuid()
para generar una identificación de tarea no hace absolutamente nada más allá de lo que hace Celery de forma predeterminada.)Simplemente use esta API de las preguntas frecuentes sobre apio
Esto funciona bien.
fuente
Respuesta de 2020:
fuente
Tratar:
task.AsyncResult(task.request.id).state
esto proporcionará el estado de la tarea de apio. Si la tarea de apio ya está en estado FALLO , arrojará una excepción:
raised unexpected: KeyError('exc_type',)
fuente
para tareas simples, podemos usar http://flower.readthedocs.io/en/latest/screenshots.html y http://policystat.github.io/jobtastic/ para hacer el monitoreo.
y para tareas complicadas, digamos una tarea que se ocupa de muchos otros módulos. Recomendamos registrar manualmente el progreso y el mensaje en la unidad de tarea específica.
fuente
Encontré información útil en el
Guía de trabajadores del proyecto de apio inspectores de trabajadores
En mi caso, estoy comprobando si Celery se está ejecutando.
Puede jugar con inspeccionar para satisfacer sus necesidades.
fuente
vi my_celery_apps / app1.py
vi tasks / task1.py
fuente
Aparte del enfoque programático anterior, se puede ver fácilmente el estado de la tarea de flor.
Monitoreo en tiempo real usando Celery Events. Flower es una herramienta basada en web para monitorear y administrar clústeres de apio.
Documento oficial: Flor - Herramienta de seguimiento del apio
Instalación:
Uso:
fuente
fuente