django 如何返回后台执行进度给前端

2014-10-04 10:47:44 +08:00
 larkifly
后台有个耗时的计算程序,想返回这个计算进度给前端,前端用一个进度条显示,请问怎么弄了?最好能给出前端ajax相关代码,因为我不太会前端,谢谢大家了
9700 次点击
所在节点    Django
7 条回复
izoabr
2014-10-04 11:49:42 +08:00
比如get /do/anything,callback proc();

返回{percent:40,done:False}给前端

前端的proc()去显示进度条,判断done字段如果不是真就继续get /do/anything?proc=SESSIONID

anything这个view,先判断有没有给proc这个参数,有就检查这个ID有没有后台任务,有就去计算进度并返回,没有这个任务抛异常;如果没有proc这个参数,就抛个单独的线程出去干活,并返回1的percent。

或者你也可以用一个单独的deamon去负责处理任务,然后django跟他之间用一种方式通讯,比如查询任务是否存在、查询进度、查询结果之类的。这样的好处是这种耗时计算将来可以很轻松得就剥离到别的机器上去干活。
如果更好一点,我就让这个deamon跟django之间用MQ通讯,那样我日后还可以把deamon横向拓展,开新deamon,加入到worker队列,就自己去分担负载了。

如果是deamon+MQ的方式还可以做成主动汇报进度,执行过程中遇到节点或者定期得通过MQ发送进度信息,django收到之后给前端反馈过去,前端callback出来就行。
jsonline
2014-10-04 11:50:09 +08:00
用假进度。
izoabr
2014-10-04 12:01:00 +08:00
另外如果技术瓶颈在前端AJAX这部分,这里有一个jQuery的样例,你看看,希望对你有帮助。

http://api.jqueryui.com/progressbar/#entry-examples
izoabr
2014-10-04 12:01:28 +08:00
@jsonline 这也是个好办法,计算出大概时间,然后除一下
20150517
2014-10-04 17:26:37 +08:00
不要重复造轮子,装个djcelery,就是django下的celery,用一个group来异步执行, group是可以查询进度,用一个js调用来查进度,根据进度更新进度条,解决
fxbird
2014-10-04 19:44:26 +08:00
只能是起个线程定期轮询了,前端用ajax定期查看进度
hanssx
2018-09-30 12:10:45 +08:00
@20150517 celery.result.ResultSet 有个 completed_count
http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.ResultSet.completed_count
但是这是 group 下有几个任务完成了,而不是每个任务的完成进度,不一样吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/136987

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX