【问题标题】:Django Processing Bar between two requests两个请求之间的 Django 处理栏
【发布时间】:2022-01-07 17:48:23
【问题描述】:

我有一个计算密集型应用程序,它需要输入并处理大约 10-15 个输入公式,包括 NPV、类似 IRR 的计算。我正在使用 django 中的模板标签实现计算。下面是sn-ps的代码:

[过滤器.py][1]

@register.filter
def **client_irr**(value,arg):
    fcf_list = []

    for i in arg:
        fcf_list.append(fcf(value,i))

    return round(npf.irr(fcf_list) * 100,2)

[inputs.html][2]

<div class="products-row">
                <div class="product-cell price">{{ i.parameter }}</div>
                <div class="product-cell price">{{ i.units }}</div>
                <div class="product-cell price">{{ i.values|**client_irr:**total_time}}</div>
</div>

这样的计算有很多!!

我正确地执行了这些计算吗?我不确定,我发现这种方式完全错误!

(/inputs) 计算值的请求大约需要 20-22 秒,并且 UI 卡住了,这创造了非常好的用户体验 (UX)。

所以,我正在寻找一个处理栏(我无法在 Django 中获得好的教程)或优化这些计算的方法。

谢谢各位!!那意义重大!如果您有任何解决方案,请帮忙!

【问题讨论】:

    标签: python django django-templates celery progress-bar


    【解决方案1】:

    我建议使用 celery 任务,该任务将从端点卸载处理并增加响应时间,当您启动 celery 任务时,celery 将为您提供一个任务 ID,您可以稍后使用它来实时跟踪进度。查看 https://docs.celeryproject.org/en/stable/userguide/tasks.html#custom-states 以存储 celery 任务的自定义状态和进度。

    要在前端实时跟踪处理进度,我建议使用django-channels https://channels.readthedocs.io/en/stable/ 并在您的网页上打开 websocket 连接以跟踪已启动的任务。这意味着您可以在 celery 任务进行时向前端提供实时更新,而不是每 X 秒轮询一些 REST api 端点来检查进度。每次计算完成时,您都可以从 celery 向用户连接的 websocket 通道连接发送消息。

    网站每次收到新的 websocket 连接消息时,它都可以包含进度百分比,并且您每次都可以更新进度条。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2021-05-25
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多