您正在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
安装。)
property
s 是描述符,用于提供对 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