Есть ли выигрыш в производительности от определения маршрутов в 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()
Вопрос
Каковы преимущества и недостатки каждого шаблона? Является ли это намного быстрее, чем другой?
Ответы
Ответ 1
Единственное влияние на производительность связано с загрузкой модулей: модули загружаются в экземпляр, когда они впервые используются, а для расщепления вещей требуется меньше нагрузок модулей для обслуживания страницы в новом экземпляре.
Это довольно минимально, так как вы можете так же легко заставить обработчик script динамически загружать необходимый модуль по запросу - и то, что уже делают многие общие фреймворки.
В общем, маршрутизация app.yaml предназначена для маршрутизации между отдельными компонентами или приложениями. Например, remote_api и отложенные оба имеют свои собственные обработчики. Поэтому вполне разумно, чтобы для вашего приложения был определен один обработчик, который обрабатывает все остальное.
Ответ 2
Я не верю, что это связано с производительностью, но разделение вашего приложения на файлы на основе функциональности поможет вам лучше управлять им, особенно если оно разрабатывается несколькими людьми.
Например, все обработчики, имеющие отношение к просмотру, редактированию, удалению и т.д. страниц, могут находиться в pages.py
, тогда как все обработчики, имеющие отношение к просмотру и т.д., могут быть в user_profiles.py
, и все обработчики, имеющие отношение к API JSON REST, могут находиться в rest_api.py
и т.д.
Но опять же, я не верю, что это связано с последствиями производительности во время выполнения, а также последствиями производительности для разработки.