Celery update_state 里面的 class 方法

Celery update_state inside class method

我是 celery 的新手,开始了解它是如何工作的。但是我在理解如何从 class 方法内部更新状态时遇到了一些麻烦。

views.py

@app.route('/',methods=['POST'])
def foo_bar():
    task = foo_async.apply_async()
    return json.dumps({}),202

background_task.py

@celery.task(bind=True)
def foo_async(self):
    t = Test()
    t.run()
    return json.dumps({'progress':100})

test.py

class Test(Task):
    def __init__(self):
        self.foo = 'bar'
    def run(self):
        for i in range(0,10):
            print 'Current : ',i
            self.update_state(state='PROGRESS',meta={'current':i})
            time.sleep(4)

但是我在发出请求后收到此错误:

[...] return task_id.replace('-','')  
AttributeError: 'NoneType' object has no attribute 'replace'

所以我看到问题是关于 id 但我不知道如何解决它。
也许有更好的方法从我的方法内部获取更新?

当您调用 self.update_state() 时,您正在使用的 self 就是您的 class Test。您需要在任务入口点提供给您的 self 上执行此操作,即函数 foo_async.

的参数

您将 class Test 定义为 Task 的子 class 有什么原因吗?您已经有一个任务,由 celery.task 装饰器创建。

尝试以下操作:

@celery.task(bind=True)
def foo_async(self):
    t = Test(self)
    t.run()
    return json.dumps({'progress':100})

class Test(object):
    def __init__(self, task):
        self.task = task
        self.foo = 'bar'
    def run(self):
        for i in range(0,10):
            print 'Current : ',i
            self.task.update_state(state='PROGRESS',meta={'current':i})
            time.sleep(4)