Celery: `delay`を呼び出す前にセロリタスクIDを取得します

作成日 2014年01月22日  ·  3コメント  ·  ソース: celery/celery

私のアプリケーションでは、テーブルを使用して、起動されたタスクの追加情報を追跡および保存します(これをアプリケーションタスクテーブルと呼びます)。 場合によっては、実際のセロリタスクで作成されたアプリケーションタスクレコードのIDが必要になります。 問題は、このアプリケーションタスクレコードはタスクが起動された後にのみ作成され(セロリタスクIDはアプリケーションタスクIDレコードの一部であるため)、実行中のタスクにタスクIDを渡すのが難しいことです。

基本的に、アプリケーションタスクレコードを作成するにはセロリタスクIDが必要であり、セロリタスクを作成するにはアプリケーションタスクIDが必要です。

この鶏が先か卵が先かという問題を解決するための強力な方法はありますか? 私が考えることができる1つの方法は、アプリケーションタスクレコードを作成するまで( task_function.delay()の呼び出し元で)何らかの方法で実行を停止することですが、箱から出してセロリでこれを行う方法を考えることはできませんまたは、アプリケーションタスクIDをタスクに渡す方法。

それについての考え、指針、ヒントはありますか? - どうもありがとう!

最も参考になるコメント

署名オブジェクトをフリーズすることで完成させることができます。

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

任意のタスクのIDを指定できます。

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

タスクが呼び出されたときに何かを行うには、 before_task_publishまたは
after_task_publishシグナル(シグナルの基本を参照)

全てのコメント3件

署名オブジェクトをフリーズすることで完成させることができます。

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

任意のタスクのIDを指定できます。

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

タスクが呼び出されたときに何かを行うには、 before_task_publishまたは
after_task_publishシグナル(シグナルの基本を参照)

どうもありがとう。 オプションtask_id = uuid() 。 それは魅力のように機能します!

私はこれが古いことを知っていますが、このようなユースケースを持っているのは私だけではないことを見るのは素晴らしかったです-そしてCeleryがいくつかの(良い)ソリューションをサポートするのを見るのも素晴らしかったです。 素晴らしいライブラリデザイン。

このページは役に立ちましたか?
0 / 5 - 0 評価