Python 正在芹菜任务中获取任务\u id
这可能是一个愚蠢的问题,但它让我在红宝石背景下感到困惑 我有一个对象,当我试图打印它时,它看起来像这样Python 正在芹菜任务中获取任务\u id,python,object,celery,Python,Object,Celery,这可能是一个愚蠢的问题,但它让我在红宝石背景下感到困惑 我有一个对象,当我试图打印它时,它看起来像这样 print celery.AsyncResult.task_id >>><property object at 0x10c383838> 致意。您正在从类访问,而任务id是异步结果实例的属性 要获得task\u id的值,首先必须创建该类的实例,然后访问async\u result\u实例。task\u id将返回真实的id 在更新的代码中: @celery.t
print celery.AsyncResult.task_id
>>><property object at 0x10c383838>
致意。您正在从类访问,而任务id
是异步结果
实例的属性
要获得task\u id
的值,首先必须创建该类的实例,然后访问async\u result\u实例。task\u id
将返回真实的id
在更新的代码中:
@celery.task
def scan(host):
print celery.AsyncResult.task_id
# ...
正如我已经解释过的,您正在访问这个类。您需要的是当前正在执行的任务的实例。您可以使用获取当前正在执行的任务对象:
@celery.task
def scan(host):
print celery.current_task.task_id
或者,如果您对唯一id感兴趣,请使用修饰函数的属性:
@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
(由于我没有安装芹菜,因此未测试代码。)
属性
用于提供对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
>>类虚拟(对象):
... @财产
... def a(自我):
... 打印(“称为getter!”)
... 返回1
...
>>>哑巴
>>>Dummy().a
叫救世主!
1.
简短的故事,在函数扫描中,使用扫描.request.id
请参见为了使您的任务更像“面向对象”,您可以使用bind
参数获取对self
的引用:
@celery.task(bind=True)
def scan(self, host):
print self.request.id
请注意,self.request.id
实际上是AsyncTask
的一个实例。为了使任务id成为字符串,您应该执行self.request.id.\uuu str\uuu()
从(示例后):
bind
参数意味着该函数将是一个“绑定方法”,因此您可以访问任务类型实例上的属性和方法
创建类的实例property
s用于提供对getter/setter方法的类似属性的访问,但它们在实例级别工作。当从类中访问它们时,您只需获得属性
包装器。@Bakuriu您实际上应该将此作为答案发布:)从字母大小写中,并输出它看起来像芹菜。AsyncResult
必须是类的名称,而不是类的实例,而task\u id
是该类的一个属性属性——我相信这就是Bakuriu所说的。嗯……我试过上面的例子,它是有意义的。然而,在芹菜工人的背景下,它不起作用。我想是因为芹菜.AsyncResult类已经创建了。所以我想我需要使用类似于“自我”的东西?是的,我想我试过了,但在工人的环境中不起作用。不过我会再试一次!你用的是什么版本的芹菜?对于较旧的版本(我想在2.2之前),有一种不同的方法来使用关键字参数。我正在使用3.0.23(交叉幻灯片)嗯-好吧,我吹了!现在可以了!谢谢你,克里斯!对我来说,使用芹菜就可以像scan.request.idf一样简单。任务中的当前任务.request.id
有效
@celery.task(bind=True)
def scan(self, host):
print self.request.id