Celery: Holen Sie sich die Sellerie-Aufgaben-ID, bevor Sie `delay` aufrufen

Erstellt am 22. Jan. 2014  ·  3Kommentare  ·  Quelle: celery/celery

In meiner Anwendung verwende ich eine Tabelle, um zusätzliche Informationen zu gestarteten Aufgaben zu verfolgen und zu speichern (nennen Sie es Anwendungsaufgabentabelle). In einigen Fällen benötige ich die ID des erstellten Anwendungsaufgabendatensatzes in der eigentlichen Sellerieaufgabe. Das Problem besteht darin, dass dieser Anwendungstaskdatensatz nur erstellt wird, wenn die Task gestartet wird (da die Sellerie-Task-ID Teil des Anwendungstask-ID-Datensatzes ist) und dass es schwierig ist, die Task-ID an eine laufende Task weiterzugeben.

Im Wesentlichen benötige ich die Sellerie-Aufgaben-ID, um den Anwendungsaufgabendatensatz zu erstellen, und ich brauche die Anwendungsaufgaben-ID, um die Sellerie-Aufgabe zu erstellen.

Gibt es einen robusten Weg, dieses Henne-Ei-Problem zu lösen? Eine Möglichkeit, die ich mir vorstellen kann, ist, die Ausführung irgendwie zu stoppen, bis ich den Anwendungsaufgabendatensatz erstellt habe (im Aufrufer von task_function.delay() ), aber mir fällt keine Möglichkeit ein, dies mit Sellerie sofort zu tun oder wie Sie die Anwendungsaufgaben-ID an die Aufgabe übergeben.

Irgendwelche Gedanken, Hinweise, Hinweise dazu? - Danke vielmals!

Hilfreichster Kommentar

Sie können Signaturobjekte finalisieren, indem Sie sie einfrieren:

>>> 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]>

Sie können die ID für jede Aufgabe angeben:

 >>> 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>

Um etwas zu tun, wenn eine Aufgabe aufgerufen wird, können Sie die before_task_publish oder
after_task_publish Signale (siehe Signal Basics )

Alle 3 Kommentare

Sie können Signaturobjekte finalisieren, indem Sie sie einfrieren:

>>> 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]>

Sie können die ID für jede Aufgabe angeben:

 >>> 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>

Um etwas zu tun, wenn eine Aufgabe aufgerufen wird, können Sie die before_task_publish oder
after_task_publish Signale (siehe Signal Basics )

Danke vielmals. Ich habe mich für Option task_id = uuid() . Es wirkt wie ein Zauber!

Ich weiß, das ist alt, aber es war großartig zu sehen, dass ich nicht der einzige mit einem solchen Anwendungsfall war - und auch großartig zu sehen, dass Celery mehrere (gute) Lösungen unterstützt. Tolles Bibliotheksdesign.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen