6

最近,我阅读了Facebook 的一篇关于他们的新页面流水线系统的文章。目前,有几个 Github 项目具有类似的实现,但它们都是用 Php 编写的。

什么是大管?

BigPipe 是 Facebook 提出的一个系统,它使页面加载速度看起来更快。单个页面被分成小 pagelet,所以看起来像这样,其中每个框都是一个 pagelet:在此处输入图像描述

所以加载整个网页的逻辑变成了:

  1. 从客户端向服务器发出的第一个请求,生成的骨架 html 非常快,具有 bigpipe javascript。
  2. 当客户端收到骨架 HTML 时,它会运行 BigPipe javascript。
  3. 虽然与服务器的连接保持持久,但“pagelet”会沿管道刷新到客户端并由 bigpipe javascript 呈现。
  4. 每个 pagelet 的 HTML、CSS 和 JS 在收到时都会下载并呈现,因此每个 pagelet 都是单独加载的,给人一种加载速度更快的感觉。

他们的数据显示页面加载时间提高了大约 2 倍。

问题

在 Pyramid 中实现这一点的主要问题是我还没有找到一种方法来保持与客户端的持久 HTTP 连接,以便能够将这些“pagelet”刷新到管道中。我已经尝试过response.app_iter,但是生成器产量没有被刷新,而是首先生成整个响应,然后一次全部刷新到管道中。有没有办法将多个“响应”刷新到与 Pyramid 的持久连接中?

4

1 回答 1

1

从这里:https ://webob.readthedocs.org/en/latest/differences.html?highlight=stream

这可以使 CherryPy 将响应正文输出目录。没有直接的等价物;您可以使用动态生成的迭代器来做类似的事情。

Pyramid 使用 webob 库对请求和响应进行建模,上述引用来自其文档。因此,我想说“标准”金字塔/塔架无法做到这一点。

相反,您将不得不使用不同的库来处理响应(可能还有请求)。这可能会给你一些关于如何做到这一点的想法:http: //docs.pylonsproject.org/projects/pyramid/en/1.3-branch/designdefense.html

或者,您可以尝试对响应对象进行子类化以添加该功能,可能通过委派另一个支持该功能的库中的代码。

您可能应该选择一个支持此功能的库,并在 Pyramid 邮件列表中询问如何最好地连接它。

于 2013-06-22T21:43:32.547 回答