2014-12-05 1 views
1

Запуск django-сельдерея 3.1.16, Сельдерей 3.1.17, Django 1.4.16. Попытка запустить несколько параллельных задач с использованием 3 рабочих и собирать результаты, используя следующие:сельдерей параллельная задача ошибка «нет результата бэкэнда настроен»

from celery import group 

positions = [] 
jobs = group(celery_calculate_something.s(data.id) for data in a_very_big_list) 
results = jobs.apply_async() 
positions.extend(results.get()) 

celery_calculate_something задача возвращает объект, чтобы поместить в списке результатов:

app.task(ignore_result=False) 
def celery_calculate_something(id): 
    <do stuff> 

Независимо от того, что я пытаюсь Я всегда получаю тот же результат при вызове Get() по результатам:

No result backend configured. Please see the documentation for more information. 

Однако бэкенд результаты сконфигурирован - у меня есть много других задач с ignore_result = False м ошибочно добавляя метаданные задач в django_celery. Это как-то связано с использованием результатов, возвращаемых из группы(). Я должен отметить, что он не установлен явно в настройках - кажется, что django-сельдерей установил его автоматически для вас.

У меня есть рабочий сбор событий с помощью:

manage.py celery worker -l info -E 

и celerycam работает с

python manage.py celerycam 

Осмотрев объект результаты возвращаются (экземпляр GroupResult) я могу видеть, что базовая атр является экземпляр DisabledBackend. Это проблема? Что я неправильно понял?

ответ

0

Вы не настроили бэкенд результатов, поэтому в основном вам нужна таблица для хранения результатов, так как у вас есть Джанго-сельдерей добавить его в INSTALLED_APPS в вашем settings.py файла, а затем выполнить миграция (python manage.py migrate) После этого откройте свой celery.py файл и измените свой сервер на djcelery.backends.database: DatabaseBackend.
Вот пример

app = Celery('almanet', 
broker='amqp://[email protected]//', 
backend='djcelery.backends.database:DatabaseBackend', 
include=['alm_crm.tasks'] #References your tasks. Donc forget to put the whole absolute path. 
) 

После этого вы можете импортировать результаты from celery import result Теперь вы можете сохранить результат и извлечь результат на job.id

from celery import group 
positions = [] 
jobs = group(celery_calculate_something.s(data.id) for data in 
a_very_big_list) 
results = jobs.apply_async() 
results.save() 
some_task_result = result.GroupResult.restore(results.id) 
print some_task_results.ready()