您好我正在尝试更新作为任务执行的方法的状态:
如: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将方法定义为任务的方法在我的例子中是不可用的。
答案 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={...})
可能您必须交换self
和task
个参数才能让他们正常工作,不确定。
BTW,似乎是Celery 4.0中的celery.contrib.methods
was removed。