Django-сельдерей: нет результирующего бэкэнда
Я пытаюсь использовать django-сельдерей в своем проекте
В settings.py у меня есть
CELERY_RESULT_BACKEND = "amqp"
Сервер начал нормально с
python manage.py celeryd --setting=settings
Но если я хочу получить результат из отложенной задачи, я получаю следующую ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\celery\result.py", line 108, in ready
return self.status in self.backend.READY_STATES
File "C:\Python27\lib\site-packages\celery\result.py", line 196, in status
return self.state
File "C:\Python27\lib\site-packages\celery\result.py", line 191, in state
return self.backend.get_status(self.task_id)
File "C:\Python27\lib\site-packages\celery\backends\base.py", line 404, in _is
_disabled
raise NotImplementedError("No result backend configured. "
NotImplementedError: No result backend configured. Please see the documentation
for more information.
Это очень странно, потому что, когда я просто запускаю celeryd (с теми же настройками сельдерея), он работает отлично. Кто-нибудь сталкивался с этой проблемой раньше?
Спасибо заранее!
Ответы
Ответ 1
У меня была такая же проблема, когда результат возвращался из задачи сельдерея, хотя была выполнена задача сельдерея (консольные журналы). То, что я нашел, у меня была такая же настройка CELERY_RESULT_BACKEND = "redis"
в настройках django.py, но я также создал экземпляр сельдерея в task.py
celery = Celery('tasks', broker='redis://localhost')
- который, я полагаю, переопределяет свойство settings.py и, следовательно, он не настраивает серверный сервер для моего экземпляра celery, который используется для хранения результатов.
я удалил это и давал django получить свойства сельдерея, чтобы получить свойства из settings.py, и образец кода работал у меня.
Ответ 2
Если вы просто запускаете образцы из http://www.celeryproject.org/tutorials/first-steps-with-celery/, вам нужно запустить консоль через manage.py:
% python manage.py shell
Ответ 3
Для тех, кто находится в отчаянном поиске решения, подобного мне.
Поместите эту строку в конец settings.py
script:
djcelery.setup_loader()
Похоже, django-celery не будет учитывать его собственные настройки без строжайшего порядка.
Ответ 4
Как настроить консоль на настройку django, чтобы получить настройки. Например, в PyCharm вы можете запустить консоль django, в которой все работает так, как ожидалось.
Ответ 5
Смотрите AMQP BACKEND SETTINGS для лучшего понимания
Примечание. Бэкэнд AMQP требует RabbitMQ 1.1.0 или выше для автоматически истекает результаты. Если вы используете более старую версию RabbitMQ вы должны отключить истечение результата следующим образом: CELERY_TASK_RESULT_EXPIRES = None
Попробуйте добавить строку ниже к вашим settings.py:
CELERY_TASK_RESULT_EXPIRES = 18000 # 5 hours
Ответ 6
В моем случае проблема заключалась в том, что я передавал аргумент CELERY_RESULT_BACKEND конструктору сельдерея:
Celery('proj',
broker = 'amqp://guest:[email protected]:5672//',
CELERY_RESULT_BACKEND='amqp://',
include=['proj.tasks'])
Решение заключалось в том, чтобы вместо этого использовать аргумент backend:
Celery('proj',
broker = 'amqp://guest:[email protected]:5672//',
backend='amqp://',
include=['proj.tasks'])