Python >> Tutoriel Python >  >> Python

Python Celery - Comment obtenir un objet de résultat de tâche par ID ?

Qu'est-ce que le céleri ?

Celery vous permet de faire évoluer votre application en répartissant la charge de travail de traitement entre plusieurs machines ou processus de travail. Celery utilise les files d'attente de tâches comme unités de travail. Un processus de travail dédié surveille ces files d'attente de tâches et en extrait de nouveaux travaux s'ils deviennent disponibles. Les clients ajoutent des messages à la file d'attente des tâches et les courtiers les transmettent aux travailleurs. Vous pouvez faire évoluer votre application en utilisant plusieurs nœuds de calcul et courtiers.

Comment créer une application minimale de céleri ?

L'exemple standard minimal pour créer votre première application Celery se compose uniquement de 5 lignes de code ! Vous importez la classe Celery et créez une application à l'aide de son constructeur. Vous y passez le courtier et définissez la tâche à l'aide du décorateur @app.task . C'est à peu près tout pour commencer !

from celery import Celery

app = Celery('hello', broker='amqp://guest@localhost//')

@app.task
def hello():
    return 'hello world'

Comment obtenir l'ID de l'objet de tâche actuel ?

Chaque céleri Task l'objet est livré avec un Task.request associé objet. Une demande de tâche contient des informations et un état liés à la tâche en cours d'exécution. Vous pouvez accéder à l'identifiant de l'objet tâche en cours d'exécution via app.Task.request.id .

Pour obtenir la tâche en cours d'exécution, vous pouvez exécuter current_task.request du current_task module après l'avoir importé avec from celery import current_task .

Voici un exemple de code minimal :

from celery import current_task
print(current_task.request)

Comment obtenir un objet de résultat de tâche par ID ?

Vous pouvez avoir plusieurs objets de résultat de tâche dans une file d'attente de tâches. Chaque tâche a un identifiant unique. Si vous connaissez déjà l'identifiant de votre objet de tâche souhaité, comment l'obtenir par identifiant ?

Exemple  :Disons que vous stockez un identifiant de tâche de celery.result.AsyncResult dans une base de données avec l'élément de tâche associé. Avec cela, vous pouvez récupérer tous les identifiants de tâche qui se rapportent à un élément spécifique. Après avoir récupéré le task_id depuis la base de données, comment récupérer des informations sur l'état de la tâche ?

Répondre :Utilisation de task.AsyncResult est la méthode recommandée :

result = my_task.AsyncResult(task_id)
x = result.get()

Cela renvoie un AsyncResult objet en utilisant le backend de résultat actuel des tâches. Pour spécifier un backend personnalisé ou par défaut de l'application actuelle, utilisez app.AsyncResult :

result = app.AsyncResult(task_id)
x = result.get()

Notez que le backend de résultats est désormais obsolète, vous devez donc l'éviter et utiliser soit le backend RPC pour les appels de type RPC ou un backen persistant d si vous avez besoin d'un accès multi-consommateurs aux résultats. (source)

Besoin d'une formation Python supplémentaire ? Découvrez notre académie gratuite par e-mail avec des aide-mémoire, des leçons Python et beaucoup de plaisir :