Celery: Obtenez l'identifiant de la tâche de céleri avant d'appeler « delay »

Créé le 22 janv. 2014  ·  3Commentaires  ·  Source: celery/celery

Dans mon application, j'utilise une table pour suivre et stocker des informations supplémentaires sur les tâches lancées (appelez-la table des tâches d'application). Dans certains cas, j'ai besoin de l'ID de l'enregistrement de tâche d'application créé dans la tâche de céleri réelle. Le problème est que cet enregistrement de tâche d'application n'est créé qu'une fois la tâche lancée (car l'ID de tâche de céleri fait partie de l'enregistrement d'ID de tâche d'application) et qu'il sera difficile de transmettre l'ID de tâche à une tâche en cours d'exécution.

Essentiellement, j'ai besoin de l'ID de tâche de céleri pour créer l'enregistrement de tâche d'application, et j'ai besoin de l'ID de tâche d'application pour créer la tâche de céleri.

Existe-t-il un moyen solide de résoudre ce problème de la poule et de l'œuf ? Une façon à laquelle je peux penser est d'arrêter l'exécution d'une manière ou d'une autre jusqu'à ce que je crée l'enregistrement de la tâche d'application (dans l'appelant de task_function.delay() ), mais je ne vois pas de moyen de le faire avec du céleri prêt à l'emploi ou comment passer l'ID de tâche d'application à la tâche.

Des idées, des pointeurs, des indices à ce sujet ? - Merci beaucoup!

Commentaire le plus utile

Vous pouvez finaliser les objets signature en les figeant :

>>> sig = add.s(2, 2)
>>> sig.freeze()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>
>>> sig.delay()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>

>>> sig = group(add.s(i, i) for i in range(5))
>>> sig.freeze()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>
>>> sig.delay()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>

Vous pouvez spécifier l'ID pour n'importe quelle tâche :

 >>> from celery import uuid
 >>> task_id = uuid()
 >>> task_id
'c7f388e9-d688-4f1d-be22-fb043b93c725'
 >>> add.apply_async((2, 2), task_id=task_id)
 <AsyncResult: c7f388e9-d688-4f1d-be22-fb043b93c725>

Pour faire quelque chose lorsqu'une tâche est appelée, vous pouvez utiliser le before_task_publish ou
signaux after_task_publish (voir Notions de base sur les signaux )

Tous les 3 commentaires

Vous pouvez finaliser les objets signature en les figeant :

>>> sig = add.s(2, 2)
>>> sig.freeze()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>
>>> sig.delay()
<AsyncResult: e89ff8f1-a556-4bb7-8b9e-5db9806ca082>

>>> sig = group(add.s(i, i) for i in range(5))
>>> sig.freeze()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>
>>> sig.delay()
<GroupResult: 9b4a8bf0-2f81-43fe-a5a0-23563441b25d [6eb971bc-ad3b-4f8f-9724-5b2baa493369, 2390bada-76f7-4680-8013-e9da78bf6a68, c5c510c1-80ed-49bc-aaaa-7ddbd5d025d2, 9be6363e-7290-407b-8c54-d6baf90d99d6, 35502fc1-9ce9-44df-917b-a6026daed646]>

Vous pouvez spécifier l'ID pour n'importe quelle tâche :

 >>> from celery import uuid
 >>> task_id = uuid()
 >>> task_id
'c7f388e9-d688-4f1d-be22-fb043b93c725'
 >>> add.apply_async((2, 2), task_id=task_id)
 <AsyncResult: c7f388e9-d688-4f1d-be22-fb043b93c725>

Pour faire quelque chose lorsqu'une tâche est appelée, vous pouvez utiliser le before_task_publish ou
signaux after_task_publish (voir Notions de base sur les signaux )

Merci beaucoup. J'ai opté task_id = uuid() option

Je sais que c'est vieux, mais c'était génial de voir que je n'étais pas le seul avec un cas d'utilisation comme celui-ci - et aussi génial de voir que Celery prend en charge plusieurs (bonnes) solutions. Grande conception de bibliothèque.

Cette page vous a été utile?
0 / 5 - 0 notes