Мое приложение работает в Google App Engine, и большинство запросов постоянно получает желтый флаг из-за большого использования ЦП. Используя профайлер, я отследил проблему до подпрограммы создания экземпляра jinja2.Environment
.Оптимизация Jinja2 Создание среды
Я создаю экземпляр на уровне модуля:
from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))
Благодаря режиму работы AppEngine Google (CGI), этот код может быть запущен на каждый запрос (их кэш импорта модуля кажется кэшировать модули на несколько секунд, а не на минуты).
Я думал о хранении экземпляра среды в memcache, но, похоже, он не был сорван. 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 основе), самый дорогой во всем цикле обработки запроса.
Какая часть вызова Окружающей среды вызывает боль? можно ли просмотреть информацию о профиле? –
Спасибо за информацию о профиле, на самом деле это не проливает свет (кроме 4000 звонков на рассол!). Думаю, мне нужно все это посмотреть. –
Возможно, вы придете в #pocoo на freenode, и мы можем поговорить об этом? –