我正在计划使用 Python 与 Twisted、Storm 和 Jinja 一起开发一个讨论软件。问题是 Jinja 不是为 Twisted 或异步套接字库而设计的,并且使用 Twisted 提供的性能是我不打算使用 Flask 的原因。
那么,如何使用 Jinja 来渲染 Twisted 网页呢?
您可以使用 Jinja 渲染网页,就像在 Twisted 中使用任何其他 Python 库一样。你只需调用它即可。这对于 Twisted 来说可以很好地工作,尽管如果 Jinja 执行了某些阻塞操作,您可能会遇到性能问题。请注意,它是possible将阻塞库与 Twisted 一起使用就可以了,可以通过deferToThread
或者如果不是性能问题,则只是阻止主循环。所以,我推断你的问题实际上是关于如何在不阻塞的情况下使用 Jinja。
Jinja 是一个模板库,这意味着它读取模板,调用模板上的一些视图逻辑,并写入一些 HTML 输出。所以有 3 件事可以阻止:
- 阅读模板,
- 写出结果。
- 运行视图逻辑(您的应用程序代码),
我不了解 Jinja,所以我不确切地知道这些东西的 API 是如何构造的,我无法告诉你该怎么做,但我的猜测是这部分很简单;因此,我将为您提供有关第 3 方模板库和 Twisted 的一般性答案。
因此,我将逐一解决这些问题,尽管顺序不完全:
1. 阅读模板
实际上,这里最合理的做法就是不在乎它。阅读模板可能真的很快。这些是经常访问的小文件,您的操作系统几乎肯定会将其保存在其文件系统缓存中。除非您正在做一些疯狂的事情,例如将它们放在 NFS 上,否则您不太可能会阻止读取它们。如果您分析您的应用程序并发现这是一个问题 - 因为,比方说,您的磁盘或远程文件系统非常慢 - 只需将模板读入cStringIO
或者在启动时类似的东西,然后将其提供给 jinja。
3. 撰写回复
网页并不是那么大,并且 Twisted 不提供阻塞 API 来写入套接字。相反,它提供了一个 API,仅将整个结果缓冲在内存中,直到可以写出为止。我的建议是在这里做与阅读模板基本相同的事情:除非您有非常大的输出,否则在将响应提供给客户端时消耗一点 RAM 可能没问题。
2. 运行视图逻辑
这是您最有可能遇到问题的区域。 Jinja 可能无法处理以下结果Deferred
s。但实际上,直接给你带来问题的并不是 Jinja:而是 Storm。当您访问某些属性时,Storm 期望能够阻止进行数据库查询。与数据库块交谈,这是大多数 Web 应用程序中阻塞 I/O 的最重要来源。所以你需要决定如何处理这个问题。您有几个选择:
- 只需在主线程中执行即可,不用担心。也许您的应用程序适用于 10 人的工作组,并且您的数据库位于本地。当然,您的 I/O 会阻塞,但如果它仍然满足性能要求,谁在乎呢?并非每个应用程序都必须扩展到月球并返回。
- 预取 Storm 中的所有内容
deferToThread
调用(或类似)并确保 Jinja 仅访问内存中的对象。这样您就可以在主线程中的回调中运行渲染器Deferred
那是在进行数据库 I/O。如果您只访问内存中的对象,您的渲染器可能仍然需要一些时间,但这没关系。这个问题促使我在我的博客上发表一篇关于“阻塞”和“运行”之间区别的文章 http://glyph.twistedmatrix.com/2011/11/blocking-vs-running.html它作为草稿已经挂了很长一段时间了;你可能想去读一下。
- 在线程或子进程中进行整个渲染,并将其视为程序的阻塞组件。这失去了使用 Twisted 的一些好处,但集成阻塞 Jinja/Storm 组件和非阻塞纯 Twisted 组件(实际的聊天消息中继部分)仍然是一个完全可行的策略。
如果这些选项都不适合您,Twisted 包含一个模板库,does支持Deferreds http://twistedmatrix.com/documents/current/web/howto/twisted-templates.html从 11.0 版本开始。您可以考虑使用twisted.web.template
作为 Jinja 的替代品。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)