我正在使用 App Engine 和 Webapp2 开发一个网站。
我了解 OO 的概念以及它们在 Python 中的应用方式。但是我对 App Engine 如何使用 OO 感到困惑。创建我的应用程序实例时,是否为每个用户创建并重复使用每个类的一个实例?还是为每个用户创建单独的实例?这将决定我应该使用实例变量还是类变量。
所以更具体地说,我什么时候应该使用 self. 变量(实例变量)以及何时应该省略 self. (类变量)?
谢谢你的帮助。:)
我正在使用 App Engine 和 Webapp2 开发一个网站。
我了解 OO 的概念以及它们在 Python 中的应用方式。但是我对 App Engine 如何使用 OO 感到困惑。创建我的应用程序实例时,是否为每个用户创建并重复使用每个类的一个实例?还是为每个用户创建单独的实例?这将决定我应该使用实例变量还是类变量。
所以更具体地说,我什么时候应该使用 self. 变量(实例变量)以及何时应该省略 self. (类变量)?
谢谢你的帮助。:)
我会将面向对象 (OO) 和请求处理的概念分开。首先,App Engine 基于请求驱动模型。请求是在 App Engine 上触发的大多数操作的基础。
其次,请注意 App Engine 实例[0] 和 webapp2.WSGIApplication[1] 之间的区别,它类似于应用程序的容器并由 App Engine 基础设施提供,它是你定义的类。
为简化起见,我假设您的应用程序只有 1 个 webapp2.WSGIApplication 。现在让我们从您的应用程序收到的第一个请求开始。在此之前,除了 App Engine 机器上可用的代码和配置之外,您的应用程序不存在任何内容。一旦请求到达 App Engine,就会创建一个新的 App Engine 实例[0]。一旦 App Engine 实例就位并设置好,它将实例化一个 webapp2.WSGIApplication 实例[1]。现在您拥有两个相关的“实例”,对象是容器的一部分。接下来,传入的请求被路由到您的 webapp2.WSGIApplication 实例,该实例将根据您所做的实现处理请求。
App Engine 系统将根据负载为您创建新的 App Engine 实例。如果单个实例无法处理所有进来的请求,它将创建一个新实例(首先是 [0],然后是前者中的 [1])并分散负载。如果这还不够,则创建第三个实例,依此类推。如果负载减少,情况也是如此。如果您的应用程序当前在 3 个实例上运行,但 2 个足以处理负载,则将杀死 1 个实例。此外,您不知道哪个特定实例将处理哪个请求。
这将我们引向您的第二个问题,您是否应该依赖实例变量。因为 App Engine 会在看起来合适的时候创建和终止实例,并且您不知道哪个实例处理请求,所以您应该始终假定实例是无状态的。虽然情况并非总是如此,但每个请求都可能由一个全新的实例处理。
如果您需要状态,请使用 memcache(易失性)或数据存储(持久性)或其他一些数据后端(blobstore、文件 API 等)。
[0] https://developers.google.com/appengine/docs/adminconsole/instances
[1] http://webapp-improved.appspot.com/guide/app.html
PS:人们确实使用实例内存来优化请求,但是开始学习 App Engine 的初学者应该认为这是一种高级技术。