在 app.yaml 中定义路由与在 AppEngine 中的 WSGIApplication 中定义一个大型映射相比有性能提升吗?

Posted

技术标签:

【中文标题】在 app.yaml 中定义路由与在 AppEngine 中的 WSGIApplication 中定义一个大型映射相比有性能提升吗?【英文标题】:Is there a performance gain from defining routes in app.yaml versus one large mapping in a WSGIApplication in AppEngine? 【发布时间】:2011-03-02 20:10:05 【问题描述】:

场景 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.pypage2.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()

问题

每种模式的优缺点是什么?一个比另一个快得多吗?

【问题讨论】:

【参考方案1】:

我不认为这对性能有任何影响,但是根据功能将应用拆分为文件将有助于您更好地管理它,特别是如果它是由多人开发的。

例如,所有与查看、编辑、删除等有关的处理程序,页面可以在pages.py,而所有与查看等有关的处理程序,用户配置文件可以在user_profiles.py ,所有与 JSON REST API 相关的处理程序都可以在 rest_api.py 中,依此类推。

但同样,我不相信这有任何运行时性能影响,只是开发时性能影响。

【讨论】:

【参考方案2】:

唯一的性能影响与模块的加载有关:模块在第一次使用时加载到实例上,将它们拆分需要更少的模块加载来为新实例上的页面提供服务。

不过,这非常小,因为您可以轻松地让处理程序脚本按需动态加载所需的模块 - 这就是许多常见框架已经做的事情。

一般来说,app.yaml 路由是为不同组件或应用程序之间的路由而设计的。例如,remote_api 和 deferred 都有自己的处理程序。因此,为您的应用定义一个处理其他所有内容的处理程序是完全合理的。

【讨论】:

以上是关于在 app.yaml 中定义路由与在 AppEngine 中的 WSGIApplication 中定义一个大型映射相比有性能提升吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将过滤器与 Google App Engine 的 app.yaml 中的 servlet 相关联?

使用 Flask-Restless 进行 GAE app.yaml 路由

Google Cloud App Engine app.yaml php72 路由问题

AppEng Py Flexi :: 长时间运行的请求 :: 502 错误

.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为啥?

在 Google AppEngine 中使用 app.yaml