请求在 Django 中花费太长时间

问题描述 投票:0回答:2

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

我不知道应该包含什么内容以供参考。我正在添加 GitHub 链接 - FES Tool

我从铁路收到的错误是应用程序未能响应。 \

这是服务器日志。

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 hosting fuzzy-logic railway
2个回答
1
投票

我想知道给你这些错误消息的包,假设它是gunicorn,你必须知道工作人员默认在30秒后超时,你可以尝试禁用超时,然后找出合适的持续时间。 要禁用gunicorn的超时,您可以使用-t或--timeout,后跟持续时间(以秒为单位),如果您输入0,则持续时间超时将是无限的。 您的命令将类似于:gunicorn -b 127.0.0.1:8000 -t (duration) test:app


0
投票

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

但是假设每个请求都需要数十分钟呢?用户不会高兴地等待最终的响应,如果他放弃并离开,响应将永远丢失。所以你需要存储他做某事的请求,并允许他稍后返回以查看他的处理是否已完成,如果已完成则收集他的结果。

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

用户稍后返回并访问他的结果。不要忘记为 

User

保留一个外键,以便 Django 可以将他的结果与其他人的结果区分开来。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.