Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find out whether celery task exists

Is it possible to find out whether a task with a certain task id exists? When I try to get the status, I will always get pending.

>>> AsyncResult('...').status 'PENDING' 

I want to know whether a given task id is a real celery task id and not a random string. I want different results depending on whether there is a valid task for a certain id.

There may have been a valid task in the past with the same id but the results may have been deleted from the backend.

like image 488
dominik Avatar asked Mar 22 '12 14:03

dominik


People also ask

How do you check the status of celery?

celery -A yourproject. app inspect status will give the status of your workers. celery -A yourproject. app inspect active will give you list of tasks currently running, etc.


2 Answers

Celery does not write a state when the task is sent, this is partly an optimization (see the documentation).

If you really need it, it's simple to add:

from celery import current_app # `after_task_publish` is available in celery 3.1+ # for older versions use the deprecated `task_sent` signal from celery.signals import after_task_publish  # when using celery versions older than 4.0, use body instead of headers  @after_task_publish.connect def update_sent_state(sender=None, headers=None, **kwargs):     # the task may not exist if sent using `send_task` which     # sends tasks by name, so fall back to the default result backend     # if that is the case.     task = current_app.tasks.get(sender)     backend = task.backend if task else current_app.backend       backend.store_result(headers['id'], None, "SENT") 

Then you can test for the PENDING state to detect that a task has not (seemingly) been sent:

>>> result.state != "PENDING" 
like image 153
asksol Avatar answered Sep 22 '22 14:09

asksol


AsyncResult.state returns PENDING in case of unknown task ids.

PENDING

Task is waiting for execution or unknown. Any task id that is not known is implied to be in the pending state.

http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending

You can provide custom task ids if you need to distinguish unknown ids from existing ones:

>>> from tasks import add >>> from celery.utils import uuid >>> r = add.apply_async(args=[1, 2], task_id="celery-task-id-"+uuid()) >>> id = r.task_id >>> id 'celery-task-id-b774c3f9-5280-4ebe-a770-14a6977090cd' >>> if not "blubb".startswith("celery-task-id-"): print "Unknown task id" ...  Unknown task id >>> if not id.startswith("celery-task-id-"): print "Unknown task id" ...  
like image 37
mher Avatar answered Sep 21 '22 14:09

mher