在金字塔中实施Facebook BigPipe系统

Wiz*_*Wiz 6 python facebook pyramid

最近,我读到的文章被Facebook对他们的新的一页流水线系统.目前,有几个Github项目具有类似的实现,但它们都是用Php编写的.

什么是BigPipe?

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

因此,加载整个网页的逻辑变成:

  1. 首先从客户端请求Server,生成的骨架html非常快,有bigpipe javascript.
  2. 当客户端收到框架HTML时,它会运行BigPipe javascript.
  3. 虽然与服务器的连接仍然持久,但"pagelets"会从管道中刷新到客户端,并由bigpipe javascript呈现.
  4. 每个pagelet的HTML,CSS和JS都会在收到时下载并呈现,因此每个pagelet都会单独加载,从而加快了加载的速度.

他们的数据显示大约2倍的页面加载时间改进.

问题

在Pyramid中实现这个问题的主要问题是我没有找到一种方法来保持与客户端的持久HTTP连接,以便能够在管道中清除这些"pagelet".我已经试过了response.app_iter,但是发电机的产量并没有被冲洗,而是首先产生整个响应,然后立即冲洗管道.有没有办法在与金字塔的持久连接中刷新多个"响应"?

Mar*_*cin 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

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

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