Есть ли выигрыш в производительности от определения маршрутов в 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
, и так далее.
Но опять же, я не верю, что это влияет на производительность во время выполнения, а влияет на производительность во время разработки.