为什么在Google App Engine代码中,webapp.WSGIApplication实例总是定义为全局变量?

6 投票
2 回答
858 浏览
提问于 2025-04-16 12:51

我刚开始学习使用谷歌的应用引擎,在我看到的很多代码中,都会把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() 函数外面声明。

撰写回答