这可能是一个愚蠢的问题,但它让来自 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
致以诚挚的问候。
没有以正确的方式访问
task_id
。正在查看
类属性
celery.AsyncResult.task_id
,而不是
实例属性
。
在 Celery 任务内部,可以通过
self.request.id
访问
task_id
。
更新后的代码如下:
@celery.task
def scan(host):
print(self.request.id) # 打印 task_id
cmd = 'ps -ef'
cm = shlex.split(cmd)
scan = subprocess.check_output(cm)
return scan
在你的任务函数中,
self
指的是
celery.Task
的实例。
self.request
是一个包含有关当前任务的信息的对象,包括
id
,它是
task_id
。
其他访问
task_id
的方法
-
在任务外: 如果在调用任务的外部需要
task_id
,则可以通过调用delay()
或apply_async()
后返回的AsyncResult
对象访问它:python result = scan.delay(host) task_id = result.id print(task_id)
-
使用
bind=True
装饰器: 如果需要访问任务实例上的其他属性,可以使用@celery.task(bind=True)
装饰器。这将把任务实例作为第一个参数传递给的任务函数。python @celery.task(bind=True) def scan(self, host): print(self.request.id) # 打印 task_id # ... 的代码 ...