105 votes

Comment vérifier l'état d'une tâche dans Celery ?

Comment vérifier si une tâche est en cours d'exécution dans celery (plus précisément, j'utilise celery-django) ?

J'ai lu la documentation, et j'ai cherché sur Google, mais je ne vois pas d'appel comme celui-ci :

my_example_task.state() == RUNNING

Mon cas d'utilisation est que j'ai un service externe (java) pour le transcodage. Lorsque j'envoie un document à transcoder, je veux vérifier si la tâche qui exécute ce service est en cours d'exécution, et si non, la (re)lancer.

J'utilise les versions stables actuelles - 2.4, je crois.

11voto

David Ding Points 279

Il suffit d'utiliser cette API à partir de FAQ sur le céleri

result = app.AsyncResult(task_id)

Cela fonctionne bien.

2voto

Réponse de 2020 :

#### tasks.py
@celery.task()
def mytask(arg1):
    print(arg1)

#### blueprint.py
@bp.route("/args/arg1=<arg1>")
def sleeper(arg1):
    process = mytask.apply_async(args=(arg1,)) #mytask.delay(arg1)
    state = process.state
    return f"Thanks for your patience, your job {process.task_id} \
             is being processed. Status {state}"

0voto

spicyramen Points 407

Essayez :

task.AsyncResult(task.request.id).state

cela fournira le statut de la tâche Celery. Si la tâche Celery est déjà en cours FAILURE il déclenchera une exception :

raised unexpected: KeyError('exc_type',)

0voto

zerocog Points 135

J'ai trouvé des informations utiles dans le

Guide des travailleurs du projet céleri - inspecteurs-travailleurs

Dans mon cas, je vérifie si Celery est en cours d'exécution.

inspect_workers = task.app.control.inspect()
if inspect_workers.registered() is None:
    state = 'FAILURE'
else:
    state = str(task.state) 

Vous pouvez jouer avec l'inspection pour obtenir vos besoins.

0voto

You ZhengChuan Points 1
  • Premièrement, dans votre céleri APP:

vi mon_celery_apps/app1.py

app = Celery(worker_name)
  • et ensuite, changez le fichier de tâche,import app de votre module celery app.

vi tasks/task1.py

from my_celery_apps.app1 import app

app.AsyncResult(taskid)

try:
   if task.state.lower() != "success":
        return
except:
    """ do something """

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X