I am pretty new to celery and django in general so please excuse my lack of knowledge. I am trying to run a test to do some calculations and wait for the test to finish so that I can make sure it is done for the correct answers.
Here is what i have:
In app/tests.py
from tasks import *
c = calculate.apply_async(args=[1])
# wait until the task is done
while not calculate.AsyncResult(c.id).status == "SUCCESS":
print c.state
pass
in app/tasks.py
from celery import shared_task
@shared_task
def calculate(proj_id):
#some calculations followed by a save of the object
The state never changes from pending even though in the celery log it says that the task was completed successfully
[2014-06-10 17:55:11,417: INFO/MainProcess] Received task: app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac]
[2014-06-10 17:55:11,505: INFO/MainProcess] Task app.tasks.calculate[1f11e7ab-0add-42df-beac-3d94c6868aac] succeeded in 0.0864518239978s: None
I have also put CELERY_IGNORE_RESULT = False in the mainapp/settings.py, but this did not seem to do anything.
Straight from doc: Result backend does not work or tasks are always in PENDING state.
All tasks are PENDING
by default, so the state would have been better named "unknown". Celery does not update any state when a task is sent, and any task with no history is assumed to be pending (you know the task id
after all).
Make sure that the task does not have ignore_result
enabled.
Enabling this option will force the worker to skip updating states.
Make sure the CELERY_IGNORE_RESULT
setting is not enabled.
Make sure that you do not have any old workers still running.
It’s easy to start multiple workers by accident, so make sure that the previous worker is properly shutdown before you start a new one.
An old worker that is not configured with the expected result backend may be running and is hijacking the tasks.
The –pidfile
argument can be set to an absolute path to make sure this doesn’t happen.
Make sure the client is configured with the right backend.
If for some reason the client is configured to use a different backend than the worker, you will not be able to receive the result, so make sure the backend is correct by inspecting it:
>>> result = task.delay(…)
>>> print(result.backend)