【问题标题】:Is it possible to query state of a celery tasks using django-celery-results during the execution of a task?是否可以在任务执行期间使用 django-celery-results 查询 celery 任务的状态?
【发布时间】:2017-06-16 06:59:37
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: python django django-celery


    【解决方案1】:

    查看 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()
    

    【讨论】:

    • task_result = TaskResult.objects.get(self.request.id) 这行中的self是什么?
    • 是错误吗?为什么你在任何课程之外都使用 self?
    • 你好,你说对了,函数定义要声明self,否则会报错。当 bind 设置为 True (bind=True) 时,在装饰器 @shared_task 中。 self 是引用当前任务实例。我正在相应地编辑函数定义。
    • 其实没有,没有,不知道为什么但是TaskReults总是挂起,没有结果,一定是我的错,但我不知道在哪里
    • 您的任务是否正在运行并显示输出?确保每次更新其值时都使用 task_result.save() 存储 task_result。除非您使用 .save() 强制模型更新,否则不会更新数据库中的条目
    猜你喜欢
    • 2016-10-30
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多