【问题标题】:heroku and django: heroku stop the function before it doneheroku 和 django:heroku 在函数完成之前停止函数
【发布时间】:2021-11-14 09:19:14
【问题描述】:

我在 Heroku 上部署了一个 Django 应用程序。我的应用程序中有一个函数(内部视图),它需要一些时间(3m-5m)才能返回。

问题是当应用程序部署到 Heroku 时函数没有返回。在我的电脑上运行良好。

Heroku 没有给我有用的反馈。日志中没有“超时”或任何内容。

【问题讨论】:

  • 不完全确定 Heroku 在做什么,但如果这个长时间运行的函数如您所说在视图中,这意味着用户在访问时必须等待 3 到 5 分钟才能加载页面你的页面。这太长了——(几乎)没有人会耐心地等待接近这个时间长度的任何地方。这听起来像是你的函数的一个很大的性能问题 - 但如果你真的需要做一些计算上昂贵的事情,那么我建议你定期“在后台”执行它并将结果缓存在数据库中,然后可以在页面上快速获取加载。
  • 函数结果取决于用户。所以我不能做缓存。

标签: python django docker heroku


【解决方案1】:

三到五分钟方式对于一个请求来说太长了。 Heroku will kill such requests:

最佳做法是将 Web 应用程序的响应时间控制在 500 毫秒以下,这将释放应用程序以处理更多请求,并为访问者提供高质量的用户体验。有时,您的应用程序可能会挂起或花费过多的时间来处理 Web 请求。发生这种情况时,如果完成时间超过 30 秒,路由器将终止请求。

我不确定为什么您没有在日志中看到超时,但如果您确实需要这么多时间来计算某些内容,您需要异步执行。

有很多方法可以做到这一点,例如您可以将工作排队,然后立即以“加载”状态响应,然后轮询后端并在结果准备好时更新视图。

首先阅读Worker Dynos, Background Jobs and Queueing,然后决定您希望如何继续。我们无法告诉您这样做的“正确”方式;这是你需要决定你的应用程序的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多