在celery任务中获取task_id

时间:2013-09-18 12:55:12

标签: python object celery

这可能是一个愚蠢的问题,但它让我难以接受Ruby背景。

当我尝试打印时,我有一个看起来像这样的对象。

print celery.AsyncResult.task_id
>>><property object at 0x10c383838>

我希望在这里打印task_id属性的实际值。我如何得到实际值?

更新1

@celery.task
def scan(host):
    print celery.AsyncResult.task_id
    cmd = 'ps -ef'
    cm = shlex.split(cmd)
    scan = subprocess.check_output(cm)
    return scan

最诚挚的问候。

3 个答案:

答案 0 :(得分:14)

短篇小说,在函数scan中,使用scan.request.id

请参阅http://docs.celeryproject.org/en/latest/userguide/tasks.html?highlight=request#task-request-info

答案 1 :(得分:13)

您正在访问该课程中的property,而task_idAsynchResult实例的属性。

要获取task_id的值,您首先必须创建该类的实例,然后访问asynch_result_instance.task_id将返回真实ID。

在您更新的代码中:

@celery.task
def scan(host):
    print celery.AsyncResult.task_id
    # ...

在这里,您正在访问我已经解释过的课程。您想要的是当前正在执行的任务的实例。您可以使用celery.current_task来获取当前正在执行的任务对象:

@celery.task
def scan(host):
    print celery.current_task.task_id

或者,如果您对唯一ID感兴趣,请使用装饰函数的request属性:

@celery.task
def scan(host):
    print scan.request.id
    cmd = 'ps -ef'
    cm = shlex.split(cmd)
    # IMPORTANT: Do *not* use "scan = ..."!
    result = subprocess.check_output(cm)
    return result

在第二种情况下,使用名为scan的任何局部变量,否则您将UnboundLocalError

(代码未经测试,因为我没有安装celery。)


propertydescriptors,用于提供类似于getter / setter方法的属性访问,以便您可以访问以下数据:

instance.attribute
instance.attribute = value

但是当执行代码时,setter或getter可以控制正在发生的事情。

您可以使用虚拟类进行验证:

>>> class Dummy(object):
...     @property
...     def a(self):
...             print("called the getter!")
...             return 1
... 
>>> Dummy.a
<property object at 0x7fdae86978e8>
>>> Dummy().a
called the getter!
1

答案 2 :(得分:9)

为了使您的任务更像“类似于OO”,您可以使用bind参数来获取对self的引用:

@celery.task(bind=True)
def scan(self, host):
  print self.request.id

请注意,self.request.id实际上是AsyncTask的一个实例。要将任务ID作为字符串,您应该self.request.id.__str__()

来自Celery's documentation(示例后):

  

bind参数表示该函数将是一个“绑定方法”,以便您可以访问任务类型实例上的属性和方法。