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

geg*_*all 5 python django celery django-celery

我在 Django 视图中执行了几个 Celery 任务(更具体地说,在 Django Rest Framework 的perform_create方法中)。

我想要实现的是立即(即,一旦任务在结果后端中有一个 id/is)访问该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)
Run Code Online (Sandbox Code Playgroud)

现在,这失败了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        
Run Code Online (Sandbox Code Playgroud)

有什么方法可以使这项工作以一种漂亮而干净的方式工作吗?

geg*_*all 1

事实证明,a) 当您在 StackOverflow 上提出问题时,您就可以自己回答;b) Django 事务管理可以完成您需要的一切。

如果您将调用包装task.apply_asyncatomic包装器中,则一切都很好,例如

with transactions.atomic():
    results = group(*tasks).apply_async()

TaskResult.objects.get(task_id=results.children[0].task_id)
Run Code Online (Sandbox Code Playgroud)