使用django执行一个需要较长计算时间的本机脚本并获取结果,应该怎样实现?

发布于 2022-09-05 10:00:44 字数 410 浏览 13 评论 0

现在要使用django制作一个简单的运维工作平台,而django其中一个优点就是可以将已有的python程序、脚本结合起来。现在有个python写的HDFS的数据提取计算脚本,在linux主机上启动一次大概需要计算10分钟(因为用的次数并不频繁,所以没必要花费精力通过mapreduce 或者其他工具在数据流入时进行处理)。

因为需要这个脚本结果的用户不一定是能登录linux主机的运维人员,所以想把这个脚本的功能整合到django页面上。这样其他人可以直接访问网页执行这个脚本,获取自己想要的结果。
这里问题就来了,这个脚本执行后,需要若干分钟的时间进行运算。而web层面的接口都要求及时的数据返回,不然可能因为一些连接上的问题,导致工作中断。我目前一个想法是,django提交请求,然后就后台运行这个脚本。然后获取到结果,这时候怎样让web用户知道自己刚发布的任务已经有了结果?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

掀纱窥君容 2022-09-12 10:00:44
  1. 使用异步任务队列工具Celery,把耗时任务扔进队列。参考:异步任务队列Celery在Django中的使用

  2. 使用Websocket以减少不必要的请求,避免浪费流量和服务器资源。参考:利用dwebsocket在Django中使用Websocket

  3. 也许前端需要知道任务进度,参考:Celery任务状态回调

百善笑为先 2022-09-12 10:00:44

这是最简单但能满足需求的办法:
1、建立一张任务表,有一个状态(0正在执行,1成功,-1失败)
2、前端发起任务,开启一个子线程执行脚本,执行完成更新任务状态为1或-1
3、如果服务端的集群资源有限,则可以限制同时仅能有一个任务执行

留一抹残留的笑 2022-09-12 10:00:44

后端通过消息中间件解耦,接口立即返回,此时表明 shell 脚本任务处理中,然后前端定时请求接口,接口检测任务的执行状态,这样是否可行

蓝梦月影 2022-09-12 10:00:44

问题的关键是,你的这个脚本在服务器上都要执行几分钟计算,是不可能马上让用户获取到计算结果的,只有暂时存储该用户这个操作的状态,在结果出来的时候给用户发一个通知。

開玄 2022-09-12 10:00:44

1、前端下发任务以后,再请求一个接口,获取任务执行状态。如果任务没有完成,接口就sleep,等着。等到请求超时(或者到一定时间再返回),前端没有得到想要的结果,再重新请求。直到成功。 这样做的好处:一旦执行完成,前端立即能知道结果;坏处,一直占着资源,量大的话耗性能。
2、抢断下发任务以后,setTimeInterval:每N秒向后端发次请求,后端立即返回结果。如果完成了,就结束;如果未完成,N秒后再请求。好处:相对来说,对后端性能稍好;坏处:后端完成了,前端不能第一时间知道,需要等1-N秒。
3、就是用Celery、Websocket等模块

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文