一个愚蠢的问题,但它让我从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
此致敬意。
短篇小说,在函数scan
中,使用 scan.request.id
。
请参阅 http://docs.celeryproject.org/en/latest/userguide/tasks.html?highlight=request#task-request-info
为了使你的任务更"类似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 的文档(在示例之后):
bind
参数意味着该函数将是一个"绑定方法",以便您可以访问任务类型实例上的属性和方法。
您正在从类访问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
是描述符,用于提供对 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