我有几个Celery任务我在Django视图中执行(更具体地说,在Django Rest Framework' perform_create
方法中)。
我想要实现的是立即(也就是说,只要任务在结果后端有id /)就可以访问TaskResult
对象并对其执行某些操作,例如:
tasks = [do_something.s(a) for a in (1, 2, 3, 4,)]
results = group(*tasks).apply_async()
for result in results.children:
task = TaskResult.objects.get(task_id=result.task_id)
do_something_with_task_object(task)
现在,这失败了django_celery_results.models.DoesNotExist: TaskResult matching query does not exist
。
我还没有尝试过,但我可以使用类似下面的代码片段来完成这项工作。但这让我觉得简单错误和丑陋,也等到任务完成后才会这样:
while not all([TaskResult.objects.filter(task_id=t.task_id).exists() for t in results.children]):
pass
有没有办法以干净整洁的方式完成这项工作?
答案 0 :(得分:1)
事实证明,a)当您在StackOverflow上提问时,您可以自己回答它并且b)Django事务管理可以完成您需要的一切。
如果你在task.apply_async
包装器中包含对atomic
的调用,一切都很好,例如。
with transactions.atomic():
results = group(*tasks).apply_async()
TaskResult.objects.get(task_id=results.children[0].task_id)