Skip to main content
 首页 » 编程设计

python之Celery update_state 内部类方法

2025年05月04日71mq0036

我是 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}) 

测试.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 就是您的类 Test。您需要在任务入口点提供给您的 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)