web-dev-qa-db-ja.com

セロリ-現在のタスクのタスクIDを取得

タスク内からタスクのtask_id値を取得するにはどうすればよいですか?私のコードは次のとおりです。

from celery.decorators import task
from Django.core.cache import cache

@task
def do_job(path):
    "Performs an operation on a file"

    # ... Code to perform the operation ...

    cache.set(current_task_id, operation_results)

アイデアは、タスクの新しいインスタンスを作成するときに、タスクオブジェクトからtask_idを取得することです。次に、タスクIDを使用して、タスクが完了したかどうかを判断します。 I do n'tタスクの完了後にファイルが「クリーンアップ」され、存在する場合と存在しない場合があるため、path値によってタスクを追跡したい。

上記の例では、current_task_idの値をどのように取得しますか?

70
mattbasta

タスクが受け入れる場合、Celeryはいくつかのデフォルトのキーワード引数を設定します。 (** kwargsを使用するか、具体的にリストすることでそれらを受け入れることができます)

@task
def do_job(path, task_id=None):
    cache.set(task_id, operation_results)

デフォルトのキーワード引数のリストはここに文書化されています: http://ask.github.com/celery/userguide/tasks.html#default-keyword-arguments

9
asksol

Celery 2.2.0以降、現在実行されているタスクに関連する情報はtask.request(「コンテキスト」と呼ばれます)。したがって、このコンテキストからタスクIDを取得する必要があります(非推奨のキーワード引数からではありません)。

@task
def do_job(path):
    cache.set(do_job.request.id, operation_results)

すべての利用可能なフィールドのリストはここに文書化されています: http://celery.readthedocs.org/en/latest/userguide/tasks.html?highlight=requestcontext#context

112
Alex Lokk

セロリ3.1以降、 bind デコレータ引数を使用して、現在のリクエストにアクセスできます。

@task(bind=True)
def do_job(self, path):
    cache.set(self.request.id, operation_results)
49