这可能是一个愚蠢的问题,但它让我难以接受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
最诚挚的问候。
答案 0 :(得分:14)
短篇小说,在函数scan
中,使用scan.request.id
。
请参阅http://docs.celeryproject.org/en/latest/userguide/tasks.html?highlight=request#task-request-info
答案 1 :(得分:13)
您正在访问该课程中的property
,而task_id
是AsynchResult
的实例的属性。
要获取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
。)
property
是descriptors,用于提供类似于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
参数表示该函数将是一个“绑定方法”,以便您可以访问任务类型实例上的属性和方法。