Функция Celery 'update_status' не работает
Я использую celery и django-celery-results в моем Django приложении. Мои результаты celery хранятся в бэкенде, и вот как выглядит celery.py.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shoonya_backend.settings")
# Define celery app and settings
celery_app = Celery(
"shoonya_backend",
result_backend="django-db",
accept_content=["application/json"],
result_serializer="json",
task_serializer="json",
)
celery_app.config_from_object("django.conf:settings", namespace="CELERY")
celery_app.autodiscover_tasks()
Я пытаюсь обновить состояние задачи из функции celery, если я получаю исключение, как показано ниже.
try:
result = resource.import_data(imported_data, raise_errors=True)
# If validation checks fail, raise the Exception
except Exception as e:
self.update_state(
state=states.FAILURE,
meta={
"exc_type": type(e).__name__,
"exc_message": traceback.format_exc().split("\n"),
},
)
Следующая команда не приводит ни к каким изменениям в таблице TaskResult
даже при возникновении исключения, а Задача всегда успешна.
Для того чтобы иметь состояние FAILURE
, вам нужно поднять исключение, иначе у вас всегда будет состояние SUCCESS
результата. Здесь вы не поднимаете исключение, вы просто обновляете состояние задачи, что не одно и то же.
Даже если вы обновляете состояние вашей задачи до FAILURE
, поскольку вы затем завершаете выполнение задачи, не вызвав никакой ошибки, оно мгновенно изменяется на SUCCESS
.
Но поднятие исключения завершит выполнение на нужном вам FAILURE
состоянии.
У вас должно быть что-то вроде этого :
try:
result = resource.import_data(imported_data, raise_errors=True)
except Exception as e:
raise e # In your backend you'll get a FAILURE state and the traceback