Orelus
Orelus

Reputation: 1023

Celery AsyncResult of task_method

I'm trying to get the state of a task as follow :

__init__.py

celery = Celery(app.name,backend='amqp',broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

foo.py

class Foo(object):  
    def bar(self):
        task = self._bar_async.apply_async()
        return task.id
    @celery.task(filter=task_method,bind=True)
    def _bar_async(task,self):
        for i in range(0,100):
            task.update_state(state='PROGRESS',meta={'progress':i})
            time.sleep(2)

taskstatus.py

def taskstatus(task_id):
    task = celery.AsyncResult(id=task_id)

Is it the recommended way to use update_state with bind ?
Also when I try to get the state of the task using taskstatus, I always get NoneType for task. What is the problem ?

Upvotes: 1

Views: 1860

Answers (1)

Jacky Wang
Jacky Wang

Reputation: 3490

There are two issues in your code

Firstly, add an argument self to apply_async method

def bar(self):
        task = self._bar_async.apply_async([self])

This change will fix the get NoneType for task issue. The reason is the task will be failed in worker, so you could not get the result.

Secondly, should use app.backend.get_result in taskstatus() to see the progress instead of AsyncResult since AsyncResult.get() will block until the task status become ready.

from apps import celery
app = celery.app

r = app.backend.get_result(task_id)
print r

Upvotes: 2

Related Questions