Мое приложение работает на Google App Engine, и большинство запросов постоянно получают желтый флаг из-за высокой загрузки ЦП. Используя профилировщик, я отследил проблему до процедуры создания экземпляра jinja2.Environment
.
Я создаю экземпляр на уровне модуля:
from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))
Благодаря режиму работы Google AppEngine (CGI), этот код можно запускать при каждом запросе (кажется, что их кеш импорта модулей кэширует модули на секунды, а не на минуты).
Я думал о том, чтобы сохранить экземпляр окружения в кэше памяти, но, похоже, это не приемлемо. Экземпляр FileSystemLoader
кажется поддающимся обработке и может быть кэширован, но я не заметил какого-либо существенного улучшения использования ЦП при таком подходе.
Кто-нибудь может предложить способ уменьшить накладные расходы на создание экземпляра jinja2.Environment
?
Изменить: ниже (релевантная) часть выходных данных профилировщика.
222172 function calls (215262 primitive calls) in 8.695 CPU seconds
ncalls tottime percall cumtime percall filename:lineno(function)
33 1.073 0.033 1.083 0.033 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait}
438/111 0.944 0.002 2.009 0.018 /base/python_dist/lib/python2.5/sre_parse.py:385(_parse)
4218 0.655 0.000 1.002 0.000 /base/python_dist/lib/python2.5/pickle.py:1166(load_long_binput)
1 0.611 0.611 0.679 0.679 /base/data/home/apps/with-the-flow/1.331879498764931274/jinja2/environment.py:10()
Один вызов, но, насколько я понимаю (и это согласуется со всеми моими приложениями на основе GAE), самый затратный за весь цикл обработки запроса.