celery 任务的实时进度跟踪

Posted

技术标签:

【中文标题】celery 任务的实时进度跟踪【英文标题】:Realtime progress tracking of celery tasks 【发布时间】:2016-05-28 00:48:35 【问题描述】:

我有一个主要的 celery 任务,它启动多个子任务(数千个)执行多个操作(每个子任务相同的操作)。

我想要的是,从主要的 celery 任务实时跟踪每个动作,每个子任务完成了多少,失败了多少。

总结!

主要任务:接收对象列表,以及为每个对象执行的操作列表。 对于每个对象,都会启动一个子任务来执行对象的操作。 当所有子任务都完成后,主任务就完成了

所以我需要从主任务中知道子任务的实时进度。

我正在开发的应用程序使用的是django/angularJs,我需要在前端异步显示实时进度。

我是 celery 新手,我很困惑,不知道如何实现。

任何帮助将不胜感激。 提前致谢。

【问题讨论】:

如果您想在 celery 中执行此操作,您无需按照建议自行编写代码 ***.com/a/48689226/69949 【参考方案1】:

我以前做过,这里代码太多,所以请允许我简单地提一下大纲,因为我相信您可以负责实际的实现和配置:

基于 Socket.io 的微服务向浏览器发送实时事件

首先,Django 是同步的,所以用它实时做任何事情并不容易。

所以我求助于 socket.io 进程。你可以说它是一个微服务,它只监听 Redis 支持的“通道”,并向监听给定通道的浏览器客户端发送通知。

Celery -> Redis -> Socket.io -> 浏览器

我做到了,所以每个频道都用 Celery 任务 ID 标识。因此,当我从浏览器触发 celery 任务时,我会获取任务 ID,保留它并开始通过该通道监听来自 socket.io 的事件。

按时间顺序是这样的:

启动 Celery 任务,获取 ID 将 ID 保留在您的客户端应用程序中,打开 socket.io 通道以侦听更新 celery 任务向 Redis 发送消息,这将触发 socket.io 事件 Socket.io 将消息实时中继到浏览器

报告进度

至于任务状态的实际更新,我只是让 Celery 任务在其代码中,在 Redis 上发送一条消息,例如'done': 2, 'total_to_be_done': 10(代表一个任务经历了 10 个步骤中的 2 个,进度为 20%,我更喜欢发送两个数字以获得更好的 UI/UX)

import redis
redis_pub = redis.StrictRedis()
channel = 'task:<task_id>:progress'
redis_pub.publish(channel, json.dumps('done': 2, 'total_to_be_done': 10))

查找使用 Python 在 Redis 上发布消息的文档here

AngularJS/Socket.io 集成

您可以使用或至少从 angular-socket-io 这样的库中获得一些灵感

【讨论】:

我也使用了类似的方法。 我同意你的方法,这完全有道理,如果你能给我一个代码示例,说明如何从 Celery 任务代码中在 Redis 上发送进度消息? 添加了通过 Redis 将消息发布到频道的示例代码

以上是关于celery 任务的实时进度跟踪的主要内容,如果未能解决你的问题,请参考以下文章

是否可以显示 django celery 任务的进度条? [复制]

celery实现任务进度查询

Project 跟踪甘特图项目百分比进度怎么自动跟新?每次看上面都是0%,求大神解决。

Django-Celery 进度条

project进度没有表格

django实现实时消息推送有啥好的方案