如果我只有任务ID,能否获取一个 celery 任务的参数?

9
如果我有原始任务,我可以从task.request.args中获取参数,但如果我只有任务ID,有没有一种方法可以获取参数?似乎没有一种方法从AsyncResult对象中获取它们,据我所知,也没有重新创建任务的方法。
我想这样做是因为我有一个前端轮询后端以更新任务的界面,如果它能显示任务参数将非常有用。鉴于参数存储在代理中,至少在任务处于挂起状态时应该是可能的。
当然还有其他方法来实现这个功能,但这是一种清晰的方法。

你使用的 Celery 版本是哪个? - Danila Ganchar
我正在使用4.0.4版本。 - nathanielobrown
2个回答

7

如果任务处于待处理状态或正在执行中,您可以查看任务的参数。最简单的方法是使用celery inspect 方法。

from celery.task.control import inspect
i = inspect()
active_tasks = i.active()
reserved_tasks = i.reserved()
scheduled_tasks = i.scheduled()

您可以通过迭代各个任务,并使用任务id,像这样获取所有任务的详细信息。
{'acknowledged': True,
   'args': '(1000,)',
   'delivery_info': {'exchange': '',
    'priority': 0,
    'redelivered': None,
    'routing_key': 'celery'},
   'hostname': 'celery@pavilion',
   'id': '30d41ba2-3e71-49ce-8e7d-830ba1152256',
   'kwargs': '{}',
   'name': 't.wait',
   'time_start': 1007.945882783,
   'type': 't.wait',
   'worker_pid': 10560}

或者,您也可以从代理商读取数据,对其进行反序列化,然后获取任务参数。


非常感谢您提供如此有用的代码片段!是否可以对已成功完成的作业执行相同的操作?提前致谢! - Lopofsky
1
我不确定是否有一种方法可以检索成功完成的作业的相同内容。 - Chillar Anand
那将会相当奇怪,因为flower可以展示所有成功的任务及其args、kwargs、results、workers等信息。我的意思是,它们应该被存储在某个地方,这样Web界面才能够检索并显示它们。 - Lopofsky
1
我认为在任务排队时,Flower会保留缓存并在任务完成后更新状态。如果您重新启动Celery,则无法查看过去的数据。您可以通过将它们存储在数据库中来使Celery数据持久化,正如我在此处提到的https://stackoverflow.com/a/36814141/2698552。 - Chillar Anand

0

对于正在运行/挂起的任务,您可以使用以下方式获取参数:

# from celery import Celery 
# app = Celery(. . .)
# assuming app is defined and is object of <Celery>... 


task_result = app.AsyncResult("<id>")
print(task_result.name) # The function name  
print(task_result.args)
print(task_result.kwargs)

默认情况下,Celery 仅会返回待处理/运行中任务的名称、参数和关键字参数。

如果想要获取已完成任务的信息,可以添加以下配置: https://docs.celeryq.dev/en/stable/userguide/configuration.html#result-extended

app = Celery(
    . . .
    result_extended=True,
)

附言:我不知道这是否会对内存或数据库造成任何影响。我没有机会对此进行实际测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接