20

这可能是一个愚蠢的问题,但它让我很难过来自 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

最好的祝福。

4

3 回答 3

23

短篇小说,在功能内scan,使用scan.request.id

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

于 2013-09-18T15:40:23.233 回答
20

为了使您的任务更像“OO-like”,您可以使用bind参数来获取对self

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

请注意,这self.request.id实际上是AsyncTask. 为了将任务 id 作为字符串,您应该这样做self.request.id.__str__()

来自Celery 的文档(在示例之后):

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

于 2015-08-04T10:41:36.717 回答
16

您正在property从类访问 ,而task_id是 的实例的属性AsyncResult

要获取您的值,task_id您首先必须创建该类的实例,然后访问async_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安装。)


propertys 是描述符,用于提供对 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
于 2013-09-18T13:03:39.917 回答