2015-03-31 2 views
1

Я новичок в сельдерее и начинаю понимать, как это работает. Однако у меня есть некоторые проблемы с пониманием того, как обновить состояние из метода класса.Celery 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' 

Так я понимаю, что проблема в отношении идентификатор, но я не знаю, как исправить это.
Возможно, есть лучший способ получить обновление из моего метода?

ответ

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

Смежные вопросы