Gly*_*yph 15
您可以使用Jinja呈现网页,就像在Twisted中使用任何其他Python库一样.你只需要打电话给它.这将适用于Twisted,但如果Jinja阻止了某些事情,你可能会遇到性能问题.请注意,这是可以使用阻塞库与扭曲的就好了,无论是通过deferToThread还是正好挡住主循环,如果它不是一个性能问题.所以,我推断你的问题实际上是关于如何使用Jinja而不阻止.
Jinja是一个模板库,这意味着它会读取模板,在模板上调用一些视图逻辑,并编写一些HTML输出.所以有3件事可以阻止:
我不知道Jinja,所以我不确切知道每个这些东西的API是如何构建的,我不能告诉你该怎么做,但我的猜测是那个部分很容易; 所以,我将给你一个关于第三方模板库和Twisted的一般答案.
所以我会解决这些问题,尽管不是很顺利:
这里最合理的做法是不关心它.阅读模板可能非常快.这些是经常访问的小文件,您的操作系统几乎肯定会保留在其文件系统缓存中.除非你把它们放在NFS上,否则你不太可能会阻止阅读它们.如果您对应用程序进行概要分析并发现这是一个问题 - 因为,比方说,您有极慢的磁盘或远程文件系统 - 只需cStringIO在启动时将模板读入或类似的东西,然后将其提供给jinja.
网页并不是那么大,Twisted没有提供阻塞API来写入套接字.相反,它提供了一个API,它只是将整个结果缓冲到内存中,直到可以写出来.我的建议是在这里做与读取模板基本相同的事情:除非你有非常大的输出,否则在响应被送到客户端时可能会烧掉一点RAM.
这是您最容易遇到问题的区域.Jinja可能无法处理Deferreds 的结果.但实际上,实际上并不是Jinja直接给你带来问题:它是Storm.当您访问某些属性时,Storm希望能够阻止,进行数据库查询.与数据库块交谈,这是大多数Web应用程序中阻止I/O的最有意义的来源.所以你需要决定如何处理这个问题.你有几个选择:
deferToThread调用(或类似)中预先从风暴中获取所有内容,并确保Jinja仅访问内存中的对象.这样,您可以在主线程中运行渲染器,在Deferred执行数据库I/O 的回调中运行渲染器.如果你只是访问内存中的对象,你的渲染器可能还需要一段时间,但这没关系.这个问题促使我在我的博客上发表一篇文章,讨论"封锁"和"跑步"之间的区别,这种区别作为草案已经搁置了很长一段时间; 你可能想读它.如果没有这些选项为你工作,扭转已经包含了模板库,不支持Deferred小号自11.0版本.您可以考虑使用twisted.web.templateJinja作为替代品.
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |