如果我只有任务 ID,我可以获得 celery 任务的参数吗?

Can I get a celery task's arguments if all I have is the task ID?

如果我有原始任务,我可以从 task.request.args 获取参数,但如果我只有任务 ID,有没有办法获取参数?看起来没有办法从 AsyncResult 对象中获取它们,据我所知,没有办法重新创建任务。

我想这样做是因为我有一个前端轮询后端以获取任务更新,如果它可以显示任务参数,那将会很有用。鉴于参数与代理一起存储,这应该是可能的,至少当任务处于挂起状态时。

当然还有其他方法可以做到这一点,但这是一种干净的做事方式。

如果任务处于挂起状态或当前正在执行,您可以看到任务的参数。最简单的方法是使用 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}

或者,你也可以从broker中读取数据,反序列化得到任务agruments。