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

更新:使用 Balthazar 对 Celery 3.1+ 的回答

@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

从 celery 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 回答