启动后立即访问django-celery-results TaskResult

时间:2017-03-06 08:35:21

标签: python django celery django-celery

我有几个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        

有没有办法以干净整洁的方式完成这项工作?

1 个答案:

答案 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)