1

当您在浏览器中有一个文档时,该负载是来自同一源服务器的一个或多个帧。

这些框架是由与主窗口相同的线程执行的吗?

或者有可能有一个处理繁重的框架而其他框架不会冻结?

我还没有找到任何规范,有人知道它在哪里吗?

4

1 回答 1

5

我不是“浏览器如何工作”的专家,但我预测的是:

你不能确定。这取决于引擎的类型(我们谈论)、浏览器及其版本......

如果我们谈论的是布局渲染引擎(通常是单线程的);一切都在单个线程的线性流中执行。传统上,它是“浏览器”的主线程,然后在 IE7 中,每个浏览器“窗口”都有自己的线程。但它会随着时间不断变化,现在每个“选项卡”大多是单线程。

在选项卡内;当 javascript 正在执行时,渲染引擎会等待它完成。原因是 Javascript 引擎传统上共享相同的单线程(但不一定)。甚至,异步事件也会排队等待适当的执行时间。

另一方面是网络运营;由多个并行线程处理。但又一次;这些操作的回调被注入到主线程中浏览器的事件循环中。(这就是为什么这些调用的数量通常是有限的)。

用于渲染;内部/嵌入式框架(例如iframe)受制于框架构造器(它负责每个具有大小、填充、边距、位置等的矩形框)。脚本执行在主窗口的同一线程中处理。(再次“一般”,因为在 Opera 中,如果它是 iframe,则情况可能并非如此。)

因此,每个浏览器都有一个内部调度实现,用于事件/操作将在何时以及如何排队和执行。例如; 下图演示了如何在 Gecko 浏览器中处理页面请求。

在此处输入图像描述

浏览器可以决定是推迟重排还是立即重排。通常原因是为了优化速度和绘画,但立即回流主要是必需的。例如,更改布局的 JavaScript 代码,例如更改 DOM 元素的高度。这应该是立即重排,以便渲染引擎可以准确计算元素的边界并继续布局过程。观看有关 Gecko 回流可视化的视频。

回到关于非冻结繁重过程的第二个问题:

在 Opera 中,您可能会将繁重的进程加载到 iframe,并且它可能不会阻塞主窗口。但这也可能会随着时间而改变。如果您无法获得可以实现这一点的 API;你不能依赖它作为非阻塞。作为开发人员,您应该认为 Javascript 和 DOM 操作是单线程的。

您可以查看HTML5 规范中的Web Workers。它们可以通过 javascript 访问。我不相信这会给 javascript 带来多线程,因为工作人员只能通过消息与另一个线程交谈,并且不能直接访问 DOM。但是,您仍然可以将繁重的计算分配给工作人员,而不会干扰您所在的线程。

更多资源:

于 2013-01-31T08:54:25.393 回答