为什么在Google App Engine代码中,webapp.WSGIApplication实例总是定义为全局变量?
我刚开始学习使用谷歌的应用引擎,在我看到的很多代码中,都会把webapp.WSGIApplication的实例声明为全局变量。其实这样做似乎并不是必要的,因为在主函数里局部声明也能正常工作。
我一直听说全局变量应该尽量避免使用。那么,为什么有些人还是选择这样做呢?
举个例子:
class Guestbook(webapp.RequestHandler):
def post(self):
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
greeting.put()
self.redirect('/')
application = webapp.WSGIApplication([ ('/', MainPage), ('/sign', Guestbook)], debug=True)
def main():
wsgiref.handlers.CGIHandler().run(application)
那为什么不这样做呢,这样也能正常工作:
class Guestbook(webapp.RequestHandler):
def post(self):
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
greeting.put()
self.redirect('/')
def main():
application = webapp.WSGIApplication([ ('/', MainPage), ('/sign', Guestbook)], debug=True)
wsgiref.handlers.CGIHandler().run(application)
在处理多个请求的例子中,这种方式也能正常工作。
2 个回答
1
这可能和应用程序的缓存有关,而不是每次都重新创建它(这样可以提高性能):
你可以告诉App Engine缓存处理脚本本身,除了缓存导入的模块。如果处理脚本里定义了一个叫做
main()
的函数,那么这个脚本和它的全局环境就会像导入的模块一样被缓存。第一次请求这个脚本时,服务器会正常执行这个脚本。之后的请求,App Engine会在缓存的环境中调用main()
函数。
摘自这里: http://code.google.com/appengine/docs/python/runtime.html#App_Caching
7
Google App Engine 有一个很棒的功能,叫做 应用缓存。
第一次调用主处理程序时,整个脚本会被执行,这时候会导入模块并创建全局变量。
如果在脚本已经执行过后再次调用这个处理程序,应用实例就会直接调用它的 main()
函数。
创建全局变量的开销只在第一次时产生,而创建的对象可以被多个请求重复使用,这样可以节省时间和资源。
所以,强烈建议选择第一种方式,把 application
变量放在 main()
函数外面声明。