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