在芹菜任务中获取task_id


这可能是

一个愚蠢的问题,但它让我从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_idAsyncResult实例的属性。

要获得 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

相关内容

  • 没有找到相关文章