如何获取Celery中的失败任务?

8 投票
2 回答
9544 浏览
提问于 2025-04-30 08:45

我正在使用celery来处理一些任务。我可以看到有多少任务是正在进行中或者已经安排好了,但我找不到查看失败任务的方法。Flower可以显示任务的状态,但只有在任务开始并失败时它正在运行的情况下才能看到。如果有命令可以获取所有失败的任务(状态:失败),请告诉我。

我在任务创建时有任务的ID,但任务数量非常庞大,有几百万个。所以即使有办法通过任务ID一个一个地检查,我也做不到。如果有这样的命令,请告诉我。

暂无标签

2 个回答

4

task idstatestatus 这两个属性。所以你可以通过任务的 ID 来获取任务的状态。

my_task_id = my_task.delay(foo)
my_task_id.state
my_task_id.status

这个状态可能是 PENDING(待处理)、STARTED(已开始)、RETRY(重试)、FAILURE(失败)或 SUCCESS(成功)。

据我所知,celery 只显示活动的、计划中的、保留的和撤销的任务,但 ID 不会显示失败的任务。

既然你有所有任务的 ID,你可以遍历它们的状态。

for task_id in task_id_list:
    if task_id.state == 'FAILURE'
        print(task_id)
11

Celery在找出失败的任务时并不太方便,但Flower(主要的Celery管理网页应用)可以简化这个过程。它会记录任务的ID,即使任务完成后也不会丢失,并且提供了一个接口,让你可以只找到失败的任务。

Flower的HTTP接口比较简单,其中有一个叫做/api/tasks端点 - 你可以使用/api/tasks?state=FAILURE来只显示失败的任务,然后解析返回的JSON数据,提取你需要的信息。内容和网页API返回的类似,使用curl来快速测试非常方便,还可以用jq来格式化和过滤数据:

curl -s 'http://localhost:5555/api/tasks?state=FAILURE&limit=5' | jq . | less

当然,使用Flower之前需要先安装并运行它。

由于你可能有数百万个已完成的任务,可能需要将失败任务的信息存储在一个数据存储中,以便高效访问 - 也许Flower可以帮上忙。或者你可以尝试在Celery中使用自定义的失败处理程序,专门捕获失败任务的信息 - 详情请见这个回答

撰写回答