请求在 Django 中花费的时间太长

Request Taking too long in Django

提问人:Minhaj Ul Islam - Moon1570 提问时间:8/23/2023 最后编辑:Minhaj Ul Islam - Moon1570 更新时间:8/23/2023 访问量:128

问:

作为论文的一部分,我一直在尝试建立一个化疗药物剂量调度的数学模型。首先,我在MATLAB中完成了逻辑,然后在Python中实现了它。然后我尝试使用 Django。虽然该应用程序在 localhost 上运行良好,但在我托管它时失败。主要是因为计算整个过程需要时间。在我的本地主机上,计算大约需要 40 秒到 1 分钟,但我得到了结果。当我在铁路中托管它时,它在第一次迭代后就放弃了。它基于模糊逻辑。另外,我在创建它时没有遵循软件开发原则,所以代码一团糟。

我不知道我应该包括哪些内容以供参考。我正在添加 GitHub 链接 - FES 工具

我从铁路收到的错误是应用程序无法响应。Railway response\

以下是服务器日志。

Not Found: /favicon.ico
14
[2023-08-23 08:12:18 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:264)
capi_return is NULL
Call-back cb_f_in_lsoda__user__routines failed.
[2023-08-23 08:12:18 +0000] [264] [INFO] Worker exiting (pid: 264)
[2023-08-23 08:12:18 +0000] [1] [ERROR] Worker (pid:264) exited with code 1
[2023-08-23 08:12:18 +0000] [1] [ERROR] Worker (pid:264) exited with code 1.
[2023-08-23 08:12:18 +0000] [327] [INFO] Booting worker with pid: 327

任何建议都是值得赞赏的。

我试图托管一个 Django 项目,该项目需要花费大量时间在后端进行计算,但我失败了。

Python Django 托管 模糊逻辑 铁路

评论


答:

1赞 samdace 8/23/2023 #1

我想知道给你这些错误消息的包,假设它的 gunicorn 你必须知道默认情况下 workers 在 30s 后超时,您可以尝试禁用超时,然后再找出合适的持续时间。 要禁用 gunicorn 的超时,您可以使用 -t 或 --timeout,然后是以秒为单位的持续时间,如果您将 0 作为持续时间超时将是无限的。 您的命令将如下所示:Gunicorn -B 127.0.0.1:8000 -t (持续时间) test:app

评论

1赞 Minhaj Ul Islam - Moon1570 8/23/2023
非常感谢您的见解。我明白了。我直接从 git 存储库部署了它,无需任何配置。但是,如果默认值为 30 秒,则问题可能出在其他地方。我在 4-5 秒后收到超时消息。LSODA 是一个微分方程求解器。我不确定capi_return为 NULL 消息。让我检查一下。
1赞 nigel222 8/23/2023 #2

GET 请求的 WWW 模型...加工。。。对浏览器的响应旨在供大量客户端同时使用,不太适合需要大量资源来生成响应的请求。Samdace 的回答告诉你如何增加超时,如果你知道(比如)一分钟总是足够的,但 30 秒就不够了,并且你知道服务器永远不会被要求一次处理超过少量的此类请求。因为太多基本上会杀死整个服务器(这是一种拒绝服务攻击,特别是如果服务器可供所有人访问,例如价格比较网站)。

但是假设每个请求需要几十分钟?用户不会乐于等待最终的响应,如果他放弃并离开,响应将永远丢失。因此,您需要存储他执行某项操作的请求,并允许他稍后返回以查看他的处理是否已完成,如果已完成,则收集他的结果。

你可以编写一个命令行命令,以自定义管理命令的形式访问 Django 数据库。然后,您需要一些东西(例如,定期 cron 作业、调用第二个管理命令或带有参数的相同命令)来检查是否有任何请求未完成,并通过启动执行管理命令的进程、从一个 Model 实例获取请求并以另一个 Model 实例的形式返回结果,一次处理一个请求(或一个合适的有限数量)。Python 的 subprocess.run 在这里可能很有用。--poll

用户稍后返回并访问其结果。别忘了保留一个 ForeignKey,这样 Django 就可以从其他人的结果中分辨出他的结果。User

这是一项相当多的工作,但主要是非常简单的 CRUD 视图。最难的是执行请求的命令内部发生的事情,您大多已经编写了请求。

您的处理命令应该有一个 catch-all 异常处理程序,以便任何类型的失败都会被记录为(失败的)结果,并且请求始终被标记为已处理,因此您永远不会永远陷入循环重新处理失败。

try:

    do_the_hard_work()

except Exception as exc: # or a wide range of more specific exceptions
     mark_this_request_failed()

finally:
     make_results_available_for_user()  # success or fail

评论

0赞 Minhaj Ul Islam - Moon1570 8/24/2023
非常感谢你为我写这么多而付出的努力。我明白我应该走一条不同的路。现在我相信这项服务作为桌面应用程序会比网站做得更好。你会看到医生需要它来检查他们给定的时间表是否能有效地对患者起作用,他们还可以看到有多少化疗剂量流向每个器官。我试图通过使用网络向所有人提供它。但正如你所提到的,他们必须等到结果得到处理。我将其标记为正确答案,因为它为我指明了前进的方向。再次感谢你:)