gpt4 book ai didi

python - celery任务的实时进度跟踪

转载 作者:行者123 更新时间:2023-12-02 09:32:25 26 4
gpt4 key购买 nike

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

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

总结一下!

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

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

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

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

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

我以前已经这样做过,这里有太多代码要放入,所以请允许我简单地放一下大纲,因为我相信你可以处理实际的实现和配置:

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

首先,Django 是同步的,因此用它实时执行任何操作并不容易。

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

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

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

按照时间顺序,它看起来像这样:

  • 启动 Celery 任务,获取 ID
  • 将 ID 保留在客户端应用中,打开 socket.io channel 以监听更新
  • 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 这样的库中获得一些灵感

关于python - celery任务的实时进度跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35437668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com