【问题标题】:Implementing a Facebook BigPipe System in Pyramid在 Pyramid 中实现 Facebook BigPipe 系统
【发布时间】:2013-06-13 02:44:40
【问题描述】:

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

什么是 BigPipe?

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 的持久连接中?

【问题讨论】:

标签: python facebook pyramid


【解决方案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 邮件列表中询问如何最好地连接它。

【讨论】:

    猜你喜欢
    • 2012-07-24
    • 2015-06-05
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多