运行django-celery 3.1.16,Celery 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.
然而,结果后端IS已配置 - 我有许多其他任务,其中ignore_result = False快速添加到django_celery中的任务元表。这与使用group()返回的结果有关。我应该注意它没有在设置中明确设置 - 似乎django-celery已经为你自动设置了它。
我让工作人员使用以下方式收集事件:
manage.py celery worker -l info -E
和celerycam一起运行
python manage.py celerycam
检查返回的结果对象(GroupResult的一个实例)我可以看到后端attr是DisabledBackend的一个实例。这是问题吗?我误解了什么?
答案 0 :(得分:0)
您没有配置结果后端,所以基本上您需要使用表来存储结果,因为您 django-celery 将其添加到中的 INSTALLED_APPS settings.py 文件,然后执行迁移(python manage.py migrate
)之后打开 celery.py 文件,将后端修改为 djcelery.backends.database:DatabaseBackend 。这是一个例子
app = Celery('almanet',
broker='amqp://guest@localhost//',
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()