Gab*_*rtz 1 javascript browser multithreading dom
当您在浏览器中有文档时,该文档会加载来自同一源服务器的一个或多个帧.
那些帧是由与主窗口相同的线程执行的?
或者可能有一个重型过程的框架,其他框架不会冻结?
我没有找到任何规范,有人知道它存在于何处?
我不是"浏览器如何工作"的专家,但我预测的是:
你不能确定.这取决于引擎的类型(我们谈论),浏览器和它的版本......
如果我们谈论的布局渲染引擎(这是一般单线程); 一切都在单个线程中的线性流中执行.传统上,它是" 浏览器 " 的主线程,然后在IE7中,每个浏览器" 窗口 "都有自己的线程.但它不断变化,现在它主要是每个" 标签 " 单线程.
在标签内; 当javascript正在执行时,渲染引擎等待它完成.原因是Javascript引擎传统上共享相同的单个线程(但不一定).甚至,异步事件排队等待适当的执行时间.
另一方面,网络运营; 通过多个并行线程处理.但是又一次; 这些操作的回调被注入到主线程中的浏览器事件循环中.(这就是为什么这些电话的数量通常是有限的).
用于渲染; 内部/嵌入框架(例如iframe)受框架构造器(它负责每个具有大小,填充,边距,位置等的矩形框)的约束.脚本执行在主窗口的同一个线程中处理.(再次" 一般 "在Opera中,如果它是iframe,情况可能并非如此.)
因此,每个浏览器都有一个内部调度实现,用于何时以及如何对事件/操作进行排队和执行.例如; 下图显示了如何在Gecko浏览器中处理页面请求.

浏览器可以决定是推迟重排还是立即重排.一般来说,原因是优化速度和涂装,但立即回流主要是一项要求.例如,改变布局的javascript代码,例如更改DOM元素的高度.这应该是立即重排,以便渲染引擎可以准确地计算元素的边界并继续布局过程.见这个视频约壁虎回流可视化.
回到关于非冻结重工艺的第二个问题:
在Opera中,您可能会将一个繁重的进程加载到iframe,它可能不会阻止主窗口.但这也可能会及时改变.如果你无法获得承诺这一点的API; 你不能依赖它作为非阻塞.作为开发人员,您应该考虑关于Javascript和DOM操作的单线程.
您可以做的是查看HTML5规范中的Web Workers.他们可以通过JavaScript访问.我不相信这会给javascript带来多线程,因为工作人员只能通过消息与另一个线程交谈,而且不能直接访问DOM.但是,您仍然可以为工作人员分配繁重的计算而不会干扰您所在的线程.