我正在使用App Engine和Webapp2开发网站。
我理解OO的概念,或多或少如何在Python中应用它们。但是我对App Engine如何使用OO感到困惑。创建应用程序的实例时,是否为每个用户创建并重新使用了每个类的一个实例?或者是为每个用户创建的单独实例?这将决定我是否应该使用实例或类变量。
更具体地说,我什么时候应该使用自己。变量(实例变量)以及何时应该省略自己。 (类变量)?
感谢您的帮助。 :)
答案 0 :(得分:3)
我将分离面向对象(OO)和请求处理的概念。首先,App Engine基于请求驱动的模型。请求是App Engine上触发的大多数操作的基础。
其次,请注意App Engine实例[0]与App Engine基础架构提供的应用程序容器之间的差异,以及webapp2.WSGIApplication [1],它是一个对象您定义的类的实例。
为简化起见,我假设您的应用只有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(volatile)或数据存储(持久性)或其他一些数据后端(blobstore,文件API等)。
[0] https://developers.google.com/appengine/docs/adminconsole/instances
PS:人们确实使用实例内存来优化请求,但是开始了解App Engine的初学者应该认为这是一种先进的技术。