优化Jinja2环境创建

时间:2009-03-06 13:19:58

标签: python google-app-engine jinja2

我的应用程序在Google App Engine上运行,并且由于CPU使用率过高,大多数请求都会不断出现黄色标记。使用分析器我将问题跟踪到创建jinja2.Environment实例的例程。

我正在模块级别创建实例:

from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))

由于谷歌AppEngine操作模式(CGI),这个代码可以在每个请求上运行(他们的模块导入缓存似乎缓存模块几秒钟而不是几分钟)。

我在考虑将环境实例存储在memcache中,但它似乎不是可选择的。 FileSystemLoader实例似乎是可选择的并且可以缓存,但我没有观察到这种方法对CPU使用率的任何实质性改进。

任何人都可以建议一种方法来减少创建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的应用程序中都是一致的),是整个请求处理周期中最昂贵的。

3 个答案:

答案 0 :(得分:10)

Armin建议将Jinja2模板预编译为python代码,并在生产中使用已编译的模板。所以我为此制作了一个编译器/加载器,现在它渲染了一些复杂的模板13倍,丢掉了全部解析开销。与存储库链接的相关讨论是here

答案 1 :(得分:4)

好的,人们,这就是我今天在#pocoo上获得的:

[20:59] zgoda:你好,我想知道我是否可以优化我的jinja2环境创建过程,问题 - > Optimizing Jinja2 Environment creation

[21:00] zgoda:我有“冷”应用程序的分析器输出 - > http://paste.pocoo.org/show/107009/

[21:01] zgoda:和“热” - > http://paste.pocoo.org/show/107014/

[21:02] zgoda:我想知道我是否可以稍微降低为“冷”请求创建环境的CPU成本

[21:05] mitsuhiko:zgoda:将env创建放入您导入的模块中

[21:05] mitsuhiko:喜欢

[21:05] mitsuhiko:来自yourapplication.utils import env

[21:05] zgoda:它已经存在了

[21:06] mitsuhiko:嗯

[21:06] mitsuhiko:我认为问题是每次访问都重新编译模板

[21:06] mitsuhiko:不幸的是,gae是令人难以置信的有限,我不知道我目前能做多少

[21:07] zgoda:我尝试使用jinja bytecache,但它不适用于prod(它在开发服务器上)

[21:08] mitsuhiko:我知道

[21:08] mitsuhiko:appengine没有元帅

[21:12] zgoda:mitsuhiko:谢谢

[21:13] zgoda:我希望我做错了,这可以优化......

[21:13] mitsuhiko:zgoda:下一个版本将提供改进的appengine支持,但我不确定如何实现改进的缓存为ae

看起来Armin意识到AppEngine上的字节码缓存存在问题,并且有一些计划要改进Jinja2以允许在GAE上进行缓存。我希望随着时间的推移情况会好转。

答案 2 :(得分:1)

根据此google recipe,您可以使用memcache来缓存字节码。您还可以缓存模板文件内容本身。所有在同一个食谱中

相关问题