真的是这样吗?
这取决于。代码重新加载高度特定于托管解决方案。大多数服务器都提供了一些方法来自动重新加载 WSGI 脚本本身,但是没有标准化;实际上,WSGI 应用程序对象如何连接到 Web 服务器的问题在不同的托管环境中存在很大差异。(您几乎可以制作一个脚本文件,用作 CGI、mod_wsgi、passenger 和 ISAPI_WSGI 的部署胶水,但这并非完全无关紧要。)
然而,Python 真正苦苦挣扎的是模块重新加载。这对于 WSGI 应用程序来说是有问题的,因为任何重要的 webapp 都会将其功能封装到模块和包中,而不是简单的独立脚本中。事实证明,重新加载模块非常棘手,因为如果您reload()
将它们一一进行,它们很容易以对旧版本的错误引用而告终。理想情况下,前进的方法是在更新任何文件时重新加载整个 Python 解释器,但实际上似乎某些 C 扩展似乎不喜欢这样,因此通常不会这样做。
有一些解决方法可以一次重新加载一组模块,当其中一个模块被触摸时,这些模块可以可靠地更新应用程序。我使用了一个部署模块来执行此操作(我还没有发布,但如果你有兴趣可以给你一份副本),它对我自己的 web 应用程序非常有用。但是您确实需要一点纪律,以确保您不会意外地将对旧模块对象的引用留在您没有重新加载的其他模块中;如果您正在谈论由第三方编写的大量网站,其代码可能会泄漏,那么这可能并不理想。
在这种情况下,您可能希望查看诸如在守护程序模式下运行 mod_wsgi 之类的东西,并为每一方和进程级重新加载一个应用程序组,并在您更新任何模块时触摸 WSGI 脚本文件。
你抱怨是对的;这(以及许多其他 WSGI 部署问题)可能需要一些标准化帮助。