是否可以在任务执行期间使用 django-celery-results 查询 celery 任务的状态?

Ous*_*uss 10 python django django-celery

我正在使用 Celery + RabbitMQ 在我的 Django 应用程序中排队任务,

我想使用 task_id 和 task_state 跟踪任务的状态。

为此,我创建了一个 TaskModel(Model) 来存储数据库中的 task_id、task_state 和一些附加数据。在任务执行时,一个新的 TaskModel 对象会随着任务的进行而保存和更新。一切正常。

但是,我仍然需要添加很多功能和特性以及错误保护等。那时我记得 celery 文档提到了 django-celery-results。

所以我遵循了 django-celery-results 文档说明。任务结果存储在默认 django 数据库中的专用表中,但是仅在任务结束后......而不是在 PENDING、STARTED 状态期间。

是否可以使用 django-celery-results 在 PENDING 和 STARTED 状态期间存储和查询任务?或不?

谢谢

Ous*_*uss 5

查看 django-celery-result 的源代码后,发现代码非常简单明了。

为了在调用任务函数后使用 django-celery-result 存储任务,请使用以下命令:

from django_celery_results.models import TaskResult
import json

@shared_task(bind=True)
def foo(self, count):
 print('hello')
 task_result = TaskResult.objects.get(self.request.id)
 counter = 1
 interval = 20 #Limit updates to reduce database queries
 interval_count = count/interval
 for i in range(count):
  print(i)
  if counter>= interval_count:
   interval_count+=count/interval
   task_result.meta = json.dumps({'progress': counter/count})
   task_result.save()
  counter+=1
 task_result.save()
 return

def goo()
 task = foo.delay(1000)
 task_result = TaskResult(task_id=task.task_id)
 task_result.save()
Run Code Online (Sandbox Code Playgroud)