gpt4 book ai didi

python - 当您在 Django View 代码中出现无限循环时会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 21:46:51 30 4
gpt4 key购买 nike

我刚刚想到的事情:

假设我正在为我的 Django 站点编写 View 代码,我犯了一个错误并创建了一个无限循环。

每当有人尝试访问 View 时,分配给请求的工作人员(无论是 Gevent 工作人员还是 Python 线程)都会无限期地保持循环。

如果我没理解错,服务器会在 30 秒后向客户端发送超时错误。但是 Python worker 会怎样呢?它会无限期地继续工作吗?这听起来很危险!

假设我有一台服务器,我在其中分配了 10 个工作人员。我让它运行,在某个时候,客户端尝试使用无限循环访问 View 。一个 worker 将被分配给它,并且在下一次服务器重新启动之前实际上已经死了。危险的是,一开始我不会注意到它,因为该站点的速度会不知不觉地变慢,有 9 个 worker 而不是 10 个。但它可能会在很长一段时间内一次又一次地发生,也许是几个月。该站点只会逐渐变慢,直到最终只有一名工作人员时它会非常慢。

服务器重启可以解决问题,但我不希望网站的功能依赖于服务器重启。

这是真实存在的问题吗? 有办法避免吗?

更新:我也非常希望有一种方法可以对陷入无限循环的线程/工作线程进行堆栈跟踪,这样我就可以通过电子邮件将其发送给我,这样我就会知道的问题。 (我不知道该怎么做,因为没有引发异常。)

更新 给那些说“避免编写具有无限循环的代码”的人:如果不是很明显,我不会花空闲时间故意在我的代码中加入无限循环代码。当这些事情发生时,它们就是错误,错误可以最小化但永远无法完全避免。我想知道即使我犯了错误,也会有一个安全网通知我并允许我解决问题。

最佳答案

这是一个真正的问题。在 gevent 的情况下,由于上下文切换,它甚至可以立即停止您的网站响应。

一切都取决于您的环境。例如,当通过 uwsgi 在生产中运行 django 时,您可以设置 harakiri - 以秒为单位的时间,如果处理请求的线程没有完成处理响应,则在该时间之后将被终止。强烈建议设置这样的值,以便处理一些错误的请求或错误的代码。此类事件在 uwsgi 日志中报告。我相信在生产环境中运行 Django 的其他解决方案也有类似的选择。

否则,由于网络架构的原因,客户端断开并不会停止无限循环,默认情况下根本不会有任何响应——只是无限加载。各种超时选项(其中一个 harakiri 是)可能最终显示连接超时 - 例如,php(据我记得)默认超时为 30 秒,它将返回 504 网关超时。套接字断开超时取决于 http 服务器设置,它不会停止应用程序线程,它只会关闭客户端套接字。

如果不使用 gevent(或任何其他绿色线程),无限循环往往会占用 100% 的可用 CPU 功率(仅限于一个内核),可能会占用越来越多的内存,因此您的网站运行速度会很慢和/或超时真的很快。 Django 本身并不知道请求时间,因此 - 如前所述 - 您的生产环境堆栈是防止这种情况发生的方法。如果是 uwsgi,http://uwsgi-docs.readthedocs.org/en/latest/Options.html#harakiri-verbose是要走的路。

Harakiri 确实会打印被杀死进程的堆栈跟踪:( https://uwsgi-docs.readthedocs.org/en/latest/Tracebacker.html?highlight=harakiri ) 直接到 uwsgi 日志,并且由于警报系统,您可以通过电子邮件收到通知 ( http://uwsgi-docs.readthedocs.org/en/latest/AlarmSubsystem.html )

关于python - 当您在 Django View 代码中出现无限循环时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252538/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com