为什么webapp.WSGIApplication的实例总是被定义为谷歌应用引擎代码中的全局变量?

sha*_*fty 6 python google-app-engine global-variables

我开始学习使用谷歌应用引擎,并且在我遇到的大部分代码中,他们将webapp.WSGIApplication的实例声明为全局变量.这似乎没有必要,因为代码在main函数中本地声明时工作正常.我总是被告知应该避免全局变量.那么这样做是否有好的,甚至不那么好的理由?

例:

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)
Run Code Online (Sandbox Code Playgroud)

为什么不这样做,这也有效:

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)
Run Code Online (Sandbox Code Playgroud)

这也适用于具有多个请求处理程序的示例.

sys*_*out 7

Google App Engine提供了一项称为App缓存的简洁功能.
第一次调用主处理程序时,将评估完整脚本导入模块并创建全局元素.
如果在已经评估了脚本之后调用处理程序,则app实例只是main()直接调用其函数.
创建全局元素的开销是第一次支付,创建的对象可以被多个请求重用,从而节省时间和资源.

也就是说,强烈建议选择第一个选项,applicationmain()函数外声明变量.