之前我已经做过,这里要放太多代码,所以请允许我简单地提出大纲,因为我相信您可以照顾实际的实现和配置:
基于Socket.io的微服务将实时事件发送到浏览器首先,Django是同步的,因此实时进行任何 *** 作都不容易。
因此,我诉诸于socket.io进程。您可以说这是一个微服务,它仅侦听Redis支持的“通道”,并向侦听给定通道的浏览器客户端发送通知。
芹菜-> Redis的-> Socket.io->浏览器我做到了,因此每个频道都带有一个Celery任务ID。因此,当我从浏览器中启动一个celery任务时,我获得了任务ID,保留它并开始通过该通道监听socket.io中的事件。
按时间顺序看起来像这样:
- 开除芹菜任务,获取ID
- 将ID保留在您的客户端应用中,打开一个socket.io频道以监听更新
- celery任务将消息发送到Redis,这将触发socket.io事件
- Socket.io将消息实时中继到浏览器
至于任务状态的实际更新,我只是这样做了,以使Celery任务在其代码内以类似方式
{'done': 2, 'total_to_be_done':10}(例如,代表一个任务经过10个步骤中的2个, 20%的进度,我更喜欢同时发送这两个数字,以获得更好的UI / UX)
import redisredis_pub = redis.StrictRedis()channel = 'task:<task_id>:progress'redis_pub.publish(channel, json.dumps({'done': 2, 'total_to_be_done': 10}))
在此处查找有关使用Python在Redis上发布消息的文档
AngularJS / Socket.io集成您可以使用或至少从诸如angular-socket-io之类的库中获得启发
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)