浏览器仍然是单线程的吗

Are browsers still single-thread?

本文关键字:单线程 仍然是 浏览器      更新时间:2023-09-26

我听了Crockford关于Javascript(2006)的一个老讲座,他在谈论模型

Flow  -> Paint
  ^        | 
  |        v
Script <- Event

(一个涉及Flow、paint、event、script…的循环),表示"因为所有浏览器都是单线程的"。

所以,我的问题是,它们仍然是单线程的吗?

对于那些可能知道的人来说,这些视频讲座就所教授的内容而言仍然相关吗?

从技术上讲,是的,在前端生成页面和操作的过程中,它们仍然都在运行单个线程。有一些方法可以让它看起来像不是,并使用html5中引入的web工作者像伪多线程一样独立运行javascript进程。pseudo的意思是,它的工作方式与大多数多线程进程类似,它在时钟中断之间切换得如此之快,看起来就像是多线程的。有关网络工作者的更多信息,请访问http://www.w3schools.com/html/html5_webworkers.asp当然还有谷歌。

就要运行的JavaScript而言,是的。这通常不是问题,因为您打算在JavaScript中执行的任何可能需要超过一毫秒的操作都可以表示为"异步"操作(例如,AJAX请求、动画转换等)。这意味着您的代码所做的就是启动操作,并注册可能的回调以完成操作。

有一个"Web工作者"是有意义的,但很少有例外,但我从未真正见过这些应用。

浏览器是Design设计的多线程浏览器

在浏览器中,普通的javascript代码由单线程的javascript运行时执行。但是像chrome这样的浏览器使用WEB APIS,它有多个线程来使用事件循环异步处理阻塞操作(如setTimeout()、DOM、Ajax等)

浏览器可能被视为单线程,因为它在一个线程中运行普通的javascript代码,但其他阻塞操作由多个线程处理。

请记住正常的javascript代码是在单个线程中处理的,即使它像forEach()那样被阻塞。如果你的程序中有一个forEach,javascript将无法执行任何操作,除非forEach()完成,但如果你定义setTimeout(),那么Web API将识别它并将其传递到隐藏线程上,因此它将被异步处理。