1
izoabr 2014-10-04 11:49:42 +08:00 1
比如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出来就行。 |
2
jsonline 2014-10-04 11:50:09 +08:00
用假进度。
|
3
izoabr 2014-10-04 12:01:00 +08:00
|
5
20150517 2014-10-04 17:26:37 +08:00 via Android
不要重复造轮子,装个djcelery,就是django下的celery,用一个group来异步执行, group是可以查询进度,用一个js调用来查进度,根据进度更新进度条,解决
|
6
fxbird 2014-10-04 19:44:26 +08:00
只能是起个线程定期轮询了,前端用ajax定期查看进度
|
7
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 下有几个任务完成了,而不是每个任务的完成进度,不一样吧。 |