【问题标题】:Multiples frames are executed in the same browser thread?多个帧在同一个浏览器线程中执行?
【发布时间】:2013-01-14 07:37:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我只是使用带有两个框架的 Chrome 进行测试,一个带有无限的 javascript 循环,另一个带有单个表单。我什至可以在另一个框架仍在计算时提交表单。希望对您有所帮助。
  • 确定这很有帮助!我仍在网上搜索它,javascript 是单线程的,但答案一直在变化。 ~ 2009 看起来你的测试会有另一种行为。我认为您测试的行为会发生,但我仍然不知道为什么以及何时更改它,以及是否有一些文档。
  • 但我认为这是浏览器特定的实现。渲染多个帧是正常的,它会引发多个线程(我希望如此)。你怎么看?

标签: javascript multithreading dom browser


【解决方案1】:

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

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

如果我们谈论的是布局渲染引擎(一般是单线程的);一切都在单个线程的线性流中执行。 传统上,它是“浏览器”的主线程,然后在 IE7 中,每个浏览器“window”都有自己的线程。但它不断变化,现在它主要是每个“tab”的单线程。

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

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

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

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

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

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

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

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

更多资源:

【讨论】:

  • +1 你的回答很完整,我知道网络工作者,在这个项目中他们已经被使用过,是关于一个带有一些 API 的 mod webkit,这些 API 只导出到 DOM,并且不能由工作人员访问,并在需要很长时间才能保持 DOM 的低硬件中运行。漏洞的想法是在主窗口忙碌时从另一个框架触发自定义 API,或者使用一个框架永远不会让主窗口忙碌。我今天将用 webkit 做一些实验,但我没有找到解释这应该如何适用于主要最新版本的浏览器的文档。只是标签线程的共识。
猜你喜欢
  • 2012-01-22
  • 1970-01-01
  • 2021-10-23
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多