有关芹菜“ FAILURE”的其他元数据

时间:2018-09-04 10:14:09

标签: python celery

是否可以发送其他芹菜状态为“ FAILURE”的元数据?

目前,我只发现可以发送异常数据,而没有其他任何东西。理想情况下,我希望将其附带的一系列额外信息发送给我的前端。

2 个答案:

答案 0 :(得分:0)

我不这么认为。但是,您可以访问任务的traceback属性以获取stacktrace,这有帮助吗?

答案 1 :(得分:0)

实际上,在深入研究之后,我找到了实现此目标的方法:

涉及一些技巧:

  1. 通过update_state

  2. 设置任务状态
  3. 确保meta参数符合Celery对FAILURE状态的期望

  4. 指示Celery从队列中删除消息,但通过Ignore()

  5. 禁用Celery的内部任务状态记录

例如:

from celery import states
from celery.exceptions import Ignore

@app.task(bind=True)
def task(self):
    try:
        raise ValueError('Some error')
    except Exception as ex:
        self.update_state(
            state=states.FAILURE,
            meta={
                'exc_type': type(ex).__name__,
                'exc_message': traceback.format_exc().split('\n')
                'custom': '...'
            })
        raise Ignore()

检索AsyncResult时,可以通过task.backend.get()调用获得其他自定义数据:

task = tasks.task.s().delay()
meta = task.backend.get(task.backend.get_key_for_task(task.id))
json.loads(meta.decode('utf8'))['result']['custom']

如果您对此感兴趣,请写一篇博客文章https://www.distributedpython.com/2018/09/28/celery-task-states-感谢您的启发;-)