4

Celery 3.0.12 を使用しています。

Q1、Q2 の 2 つのキューがあります。

通常、メイン タスクを Q1 に置き、サブタスクを呼び出して Q2 に移動します。サブタスクの結果を保存したくありません。したがって、私のサブタスクにはデコレータ @celery.task(ignore_results=True) があります。

メインタスクは、サブタスクが完了するまで待機する必要があります。結果を書かないので。使用できません: AsyncResult. 状態をバックエンドに保存せずにサブタスクが終了するまで待機するメインタスクで待機する方法はありますか? AsyncResults を使用したすべての試みは、成功の燃料ではありません (バックエンドに依存しています)。get() もバックエンドに依存しているようです。

コード内のストーリー全体:

@celery.task(ignore_result=True)
def subtask():
   #Do something

@celery.task
def maintask():
    # Do something

    # Call subtask on Q2:
    res = subtask(options={'queue':'Q2'}).delay()

    # Need to wait till subtask finishes
    # NOT WORKING (DOES NEVER RETURN)
    res.get()

Celery Flower を使用してアプリケーション全体を監視していますが、サブタスクが正常に終了していることがわかります。セロリはどのようにしてその状態を検出できますか? 私は彼らのコードを閲覧しましたが、彼らがどのように検出を行っているかを見つけることができませんでした.

4

1 に答える 1

3

メインタスクは、サブタスクが完了するまで待機する必要があります。

サブタスクを待機しないでください。リソース不足やデッドロック (すべてのタスクが別のタスクを待機しているが、それらを処理するワーカーがいない) につながる可能性があるためです。

代わりに、サブタスクの完了後にコールバックを使用して追加のアクションを実行する必要があります (Celery ユーザー ガイドの Canvas ガイドを参照してください)。

Celery Flower を使用してアプリケーション全体を監視していますが、サブタスクが正常に終了していることがわかります。セロリはどのようにしてその状態を検出できますか? 私は彼らのコードを閲覧しましたが、彼らがどのように検出を行っているかを見つけることができませんでした.

Flower やその他のモニターは結果 (タスクの状態) を使用せず、代わりにイベントと呼ばれるものを使用します。

ワーカーで特定のアクションが発生するとイベント メッセージが発行され、これが一時的なメッセージ ストリームになります。プロセスは、クラスターを監視するために特定のイベント (またはそれらすべて) にサブスクライブできます。

イベントはタスクの状態とは別のものです。

  • イベントは永続的ではありません (一時的)

    イベントの欠落は重大な障害とは見なされません。

  • 複雑なフィールドはシリアル化されません

    イベントは診断および情報提供を目的としており、たとえばタスクの戻り値や例外を内省するために使用しないでくださいrepr()。モニターを他の言語で記述できるようにするためにこれらの値のみが保存され、大きなフィールドは高速化のために切り詰められる可能性があるためです。トランスミッション。

于 2013-01-11T12:49:02.203 に答える