芹菜任务的实时进度跟踪

时间:2016-02-16 16:20:00

标签: python django python-3.x asynchronous celery

我有一个主芹菜任务,可以启动多个子任务(数千个)执行多个操作(每个子任务执行相同的操作)。

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

总结!

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

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

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

我是芹菜的新手,我很困惑,也不知道如何实施。

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

1 个答案:

答案 0 :(得分:5)

之前我已经完成了这个,这里有太多的代码,所以请允许我简单地提出大纲,因为我相信你可以处理实际的实现和配置:

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

首先,Django是同步的,因此用它实时处理并不容易。

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

芹菜 - > Redis - > Socket.io - >浏览器

我做到了这一点,因此每个频道都使用Celery任务ID进行识别。因此,当我从浏览器触发芹菜任务时,我获取任务ID,保留它并开始通过该通道从socket.io中侦听事件。

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

  • 解雇Celery任务,获取ID
  • 将ID保留在客户端应用中,打开socket.io频道以收听更新
  • 芹菜任务向Redis发送消息,这将触发socket.io events
  • 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 here

在Redis上发布消息的文档

AngularJS / Socket.io集成

您可以使用或至少从angular-socket-io

等库中获取灵感