Celery:使用类时更新任务状态

时间:2016-11-02 10:20:35

标签: python celery python-3.5

您好我正在尝试更新作为任务执行的方法的状态:

如:http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html

中所述
from celery import Celery

celery = Celery()

class A(object):

    def __init__(self):
        self.a = 0

    @celery.task(filter=task_method)
    def add(self):
         self.a += 10

         for i in range(10):
             self.update_state(state="PROGRESS", meta={
                 "current": i, "total": 10, "status": "Sleeping"
             })


         return {"current": 100, "total": 100, "status": "Complete."}



a = A()
a.add.delay()

哪个出错:

AttributeError: 'A' object has no attribute 'update_state'

这对我来说是合乎逻辑的,因为A不会从任务继承,因此它没有得到" update_task"方法

问题:如何在使用基于方法的任务时更新任务状态???

更新: 如下面的评论中所述,更新任务的状态 没有绑定是不可能的,因此celery.contrib.methods将方法定义为任务的方法在我的例子中是不可用的。

1 个答案:

答案 0 :(得分:0)

可能你可以这样做:

from celery import Celery, current_task

celery = Celery()

class A:
  @celery.task(filter=task_method)
  def add(self):
    # ...
    current_task.update_state('PROGRESS', meta={...})

a = A()
a.add.delay()

请注意,我使用current_task代理而不是self变量(与类方法相反,在绑定的Celery任务中表示当前任务)。

或者(没有检查,但可能它也应该工作),你也可以绑定类方法任务:

class A:
  @celery.task(filter=task_method, bind=True)
  def add(self, task):
    task.update_state('PROGRESS', meta={...})

可能您必须交换selftask个参数才能让他们正常工作,不确定。

BTW,似乎是Celery 4.0中的celery.contrib.methods was removed