现在要使用django制作一个简单的运维工作平台,而django其中一个优点就是可以将已有的python程序、脚本结合起来。现在有个python写的HDFS的数据提取计算脚本,在linux主机上启动一次大概需要计算10分钟(因为用的次数并不频繁,所以没必要花费精力通过mapreduce 或者其他工具在数据流入时进行处理)。
因为需要这个脚本结果的用户不一定是能登录linux主机的运维人员,所以想把这个脚本的功能整合到django页面上。这样其他人可以直接访问网页执行这个脚本,获取自己想要的结果。
这里问题就来了,这个脚本执行后,需要若干分钟的时间进行运算。而web层面的接口都要求及时的数据返回,不然可能因为一些连接上的问题,导致工作中断。我目前一个想法是,django提交请求,然后就后台运行这个脚本。然后获取到结果,这时候怎样让web用户知道自己刚发布的任务已经有了结果?
使用异步任务队列工具Celery,把耗时任务扔进队列。参考:异步任务队列Celery在Django中的使用
使用Websocket以减少不必要的请求,避免浪费流量和服务器资源。参考:利用dwebsocket在Django中使用Websocket
也许前端需要知道任务进度,参考:Celery任务状态回调