Google App Engine是每个请求运行一个实例还是所有请求共享一个实例?
使用谷歌应用引擎:
# more code ahead not shown
application = webapp.WSGIApplication([('/', Home)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
如果两个不同的用户在两台不同的机器上请求同一个网页,会启动两个独立的服务器实例吗?
还是说只有一个服务器实例一直在运行,处理所有的请求?
如果一个用户在同一个浏览器里打开网页两次呢?
编辑:
根据下面的回答,一个实例可能会轮流处理不同用户的请求。那么考虑以下这段代码,来自谷歌的示例:
class User(db.Model):
email = db.EmailProperty()
nickname = db.StringProperty()
1. email 和 nickname 在这里是定义为类变量吗?
2. 所有由同一个服务器实例处理的请求共享相同的变量,因此可能会互相干扰?(比如,一个用户的邮箱出现在另一个用户的页面上)
附注:我知道我应该多读手册和文档,我正在这样做,不过有经验的程序员的回答真的能帮助我更快更全面地理解,谢谢。
2 个回答
App Engine会根据请求的数量,自动增加或减少运行的实例。
根据文档的说明:
App Engine的应用程序可以在任何时刻由多个实例提供支持,这个数量会根据你应用收到的请求量而变化。当你的应用请求量增加时,支持它的实例数量也会随之增加。
每个实例都有自己的请求队列,用来处理进入的请求。App Engine会监控每个实例队列中等待的请求数量。如果发现某个应用的请求队列因为负载增加而变得过长,App Engine会自动创建一个新的实例来处理这些请求。
当请求量减少时,App Engine会反向缩减实例的数量。这样,App Engine确保你应用当前的所有实例都能高效使用。这种自动扩展的功能让使用App Engine变得非常划算。
如果一个应用完全没有被使用,App Engine会关闭它相关的实例,但一旦需要时,它会迅速重新加载这些实例。
一个实例在它的生命周期内可以处理很多请求。在Python运行时的线程模型中,每个实例在任何时候只能处理一个请求。如果两个请求同时到达,它们可能会一个接一个地由同一个实例处理,或者可能会启动一个新的实例来处理其中一个请求。
编辑:
一般来说,每个请求使用的变量会限制在RequestHandler实例的.get()
或.post()
方法中,因此这些变量不会“泄漏”到其他请求中。你在脚本中使用全局变量时要小心,因为这些全局变量会被实例缓存,并且会在请求之间共享。不要在不清楚自己为什么要使用全局变量的情况下使用它们(这对任何应用程序来说都是个好建议),这样你就没问题了。