with shared_task results how autodiscover_tasks app celery celery-task

celery - shared_task - ¿Cómo hacer que una tarea de apio falle desde dentro de la tarea?



django celery results (2)

Obtuve una interesante respuesta a esta pregunta de Ask Solem, donde él propone un controlador ''after_return'' para resolver el problema. Esta podría ser una opción interesante para el futuro.

Mientras tanto, resolví el problema simplemente devolviendo una cadena ''FALLO'' de la tarea cuando quiero que falle y luego verificando eso de la siguiente manera:

result = AsyncResult(task_id) if result.state == ''FAILURE'' or (result.state == ''SUCCESS'' and result.get() == ''FAILURE''): # Failure processing task

Bajo ciertas condiciones, quiero hacer que una tarea de apio falle dentro de esa tarea. Intenté lo siguiente:

from celery.task import task from celery import states @task() def run_simulation(): if some_condition: run_simulation.update_state(state=states.FAILURE) return False

Sin embargo, la tarea aún informa haber tenido éxito:

La tarea sim.tasks.run_simulation [9235e3a7-c6d2-4219-bbc7-acf65c816e65] tuvo éxito en 1.17847704887s: Falso

Parece que el estado solo se puede modificar mientras la tarea se está ejecutando y una vez que se completa, el apio cambia el estado a lo que considere que es el resultado (consulte esta pregunta ). ¿Hay alguna manera, sin fallar en la tarea al hacer una excepción, para hacer que el apio regrese que la tarea ha fallado?


Una mejor manera de hacer esto es actualizar el estado de la tarea como FAILURE y luego generar una excepción Ignore , ya que devolver cualquier valor registrará la tarea como exitosa, por ejemplo:

from celery import Celery, states from celery.exceptions import Ignore app = Celery(''tasks'', broker=''amqp://guest@localhost//'') @app.task(bind=True) def run_simulation(self): if some_condition: # manually update the task state self.update_state( state = states.FAILURE, meta = ''REASON FOR FAILURE'' ) # ignore the task so no other state is recorded raise Ignore()