在AppEngine中定义app.yaml中的路由比在WSGIApplication中使用一个大型映射有性能提升吗?
场景 1
这个场景是用一个“网关”路由在 app.yaml
文件里,然后在 WSGIApplication
中选择 RequestHandler
。
app.yaml
- url: /.*
script: main.py
main.py
from google.appengine.ext import webapp
class Page1(webapp.RequestHandler):
def get(self):
self.response.out.write("Page 1")
class Page2(webapp.RequestHandler):
def get(self):
self.response.out.write("Page 2")
application = webapp.WSGIApplication([
('/page1/', Page1),
('/page2/', Page2),
], debug=True)
def main():
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
场景 2:
这个场景是定义两个路由在 app.yaml
文件里,然后为每个路由写两个独立的脚本(page1.py
和 page2.py
)。
app.yaml
- url: /page1/
script: page1.py
- url: /page2/
script: page2.py
page1.py
from google.appengine.ext import webapp
class Page1(webapp.RequestHandler):
def get(self):
self.response.out.write("Page 1")
application = webapp.WSGIApplication([
('/page1/', Page1),
], debug=True)
def main():
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
page2.py
from google.appengine.ext import webapp
class Page2(webapp.RequestHandler):
def get(self):
self.response.out.write("Page 2")
application = webapp.WSGIApplication([
('/page2/', Page2),
], debug=True)
def main():
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
问题
这两种模式各有什么优缺点?哪种方式的速度更快吗?
2 个回答
6
我觉得把你的应用程序按功能分成不同的文件不会影响性能,但这样做能让你更好地管理代码,尤其是当有多人一起开发的时候。
比如,所有与查看、编辑、删除页面相关的处理程序可以放在 pages.py
文件里,而所有与查看用户资料相关的处理程序可以放在 user_profiles.py
文件里,所有与 JSON REST API 相关的处理程序可以放在 rest_api.py
文件里,依此类推。
不过,我再次强调,这样做对程序运行时的性能没有影响,只是对开发时的管理和效率有帮助。
12
性能方面唯一需要注意的是模块的加载:模块在第一次使用时会被加载到实例中,而将内容拆分开来可以减少在新实例上加载模块的次数,从而更快地展示页面。
不过,这个影响其实很小,因为你也可以让处理脚本根据需要动态加载所需的模块——而且很多常见的框架都是这样做的。
一般来说,app.yaml 的路由设计是为了在不同的组件或应用之间进行路由。例如,remote_api 和 deferred 各自都有自己的处理程序。因此,为你的应用定义一个处理程序来处理其他所有请求是完全合理的。