larkifly
V2EX  ›  Django

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

  •  
  •   larkifly · Oct 4, 2014 · 10395 views
    This topic created in 4282 days ago, the information mentioned may be changed or developed.
    后台有个耗时的计算程序,想返回这个计算进度给前端,前端用一个进度条显示,请问怎么弄了?最好能给出前端ajax相关代码,因为我不太会前端,谢谢大家了
    7 replies    2018-09-30 12:10:45 +08:00
    izoabr
        1
    izoabr  
       Oct 4, 2014   ❤️ 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出来就行。
    jsonline
        2
    jsonline  
       Oct 4, 2014
    用假进度。
    izoabr
        3
    izoabr  
       Oct 4, 2014
    另外如果技术瓶颈在前端AJAX这部分,这里有一个jQuery的样例,你看看,希望对你有帮助。

    http://api.jqueryui.com/progressbar/#entry-examples
    izoabr
        4
    izoabr  
       Oct 4, 2014
    @jsonline 这也是个好办法,计算出大概时间,然后除一下
    20150517
        5
    20150517  
       Oct 4, 2014 via Android
    不要重复造轮子,装个djcelery,就是django下的celery,用一个group来异步执行, group是可以查询进度,用一个js调用来查进度,根据进度更新进度条,解决
    fxbird
        6
    fxbird  
       Oct 4, 2014
    只能是起个线程定期轮询了,前端用ajax定期查看进度
    hanssx
        7
    hanssx  
       Sep 30, 2018
    @20150517 celery.result.ResultSet 有个 completed_count
    http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.ResultSet.completed_count
    但是这是 group 下有几个任务完成了,而不是每个任务的完成进度,不一样吧。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3108 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 12:56 · PVG 20:56 · LAX 05:56 · JFK 08:56
    ♥ Do have faith in what you're doing.