Есть ли выигрыш в производительности от определения маршрутов в 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()

Вопрос

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам