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)
有什么方法可以使这项工作以一种漂亮而干净的方式工作吗?
事实证明,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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1254 次 |
| 最近记录: |