Подтвердить что ты не робот

Есть ли выигрыш в производительности от определения маршрутов в app.yaml по сравнению с одним большим отображением в WSGIApplication в AppEngine?

Сценарий 1

Это предполагает использование одного маршрута "шлюза" в app.yaml, а затем выбор RequestHandler в WSGIApplication.

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()

Вопрос

Каковы преимущества и недостатки каждого шаблона? Является ли это намного быстрее, чем другой?

4b9b3361

Ответ 1

Единственное влияние на производительность связано с загрузкой модулей: модули загружаются в экземпляр, когда они впервые используются, а для расщепления вещей требуется меньше нагрузок модулей для обслуживания страницы в новом экземпляре.

Это довольно минимально, так как вы можете так же легко заставить обработчик script динамически загружать необходимый модуль по запросу - и то, что уже делают многие общие фреймворки.

В общем, маршрутизация app.yaml предназначена для маршрутизации между отдельными компонентами или приложениями. Например, remote_api и отложенные оба имеют свои собственные обработчики. Поэтому вполне разумно, чтобы для вашего приложения был определен один обработчик, который обрабатывает все остальное.

Ответ 2

Я не верю, что это связано с производительностью, но разделение вашего приложения на файлы на основе функциональности поможет вам лучше управлять им, особенно если оно разрабатывается несколькими людьми.

Например, все обработчики, имеющие отношение к просмотру, редактированию, удалению и т.д. страниц, могут находиться в pages.py, тогда как все обработчики, имеющие отношение к просмотру и т.д., могут быть в user_profiles.py, и все обработчики, имеющие отношение к API JSON REST, могут находиться в rest_api.py и т.д.

Но опять же, я не верю, что это связано с последствиями производительности во время выполнения, а также последствиями производительности для разработки.