81

タスク内からタスクの 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 を使用して、タスクが完了したかどうかを判断します。タスクの完了後にファイルが「クリーンアップ」され、存在する場合と存在しない場合があるため、値でタスクを追跡したくありません。path

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

4

3 に答える 3

131

更新: Celery 3.1+ には Balthazar の回答を使用してください

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

彼の答えに賛成票を投じてください。

古い答え:

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に記載されています。

于 2011-11-11T15:21:44.377 に答える
78

セロリ 3.1 以降では、binddecorator 引数を使用して、現在のリクエストにアクセスできます。

@task(bind=True)
def do_job(self, path):
    cache.set(self.request.id, operation_results)
于 2015-12-14T10:27:40.210 に答える
9

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に記載されています。

于 2010-07-21T20:17:17.463 に答える