2015-03-31 76 views
1

我是芹菜新手,並開始瞭解它是如何工作的。不過,我在理解如何從類方法內部更新狀態方面遇到了一些麻煩。芹菜update_state裏面的方法

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但我不如何解決。
也許有更好的方法從我的方法內更新?

回答

4

當您致電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) 
+0

非常感謝!我知道這是類似的東西,但無法弄清楚... – Orelus 2015-04-06 16:59:21