Celery update_state里面的类方法

时间:2015-03-31 14:47:10

标签: python flask celery

我是芹菜的新手并开始了解它的工作原理。但是我在理解如何从类方法中更新状态时遇到了一些麻烦。

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 有关,但我不知道如何解决这个问题。
也许有更好的方法从我的方法内部获得更新?

1 个答案:

答案 0 :(得分:5)

当您致电self.update_state()时,您使用的self是您班级Test的{​​{1}}。你需要在你的任务的入口点给你的self上做这个,这个函数的参数是foo_async

您有没有理由将类Test定义为Task的子类?您已经有一个由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)