Javascript 为什么现代浏览器JS引擎是多线程的?

Javascript 为什么现代浏览器JS引擎是多线程的?,javascript,asynchronous,internals,Javascript,Asynchronous,Internals,我知道现代浏览器的JS工程师(如V8、Spidermonkey、Chakra等)在内部使用线程池,即使只有一个线程(运行事件循环)向JS程序员公开 显然,(很少使用的)Web工作者需要多个线程(或多个进程)——否则他们无法利用多个CPU核。我的问题是,除了Web工作者,使用多线程实现JS引擎还有什么好处 为什么JS引擎不能在内部依赖JS程序员使用的相同事件循环,在需要执行任何IO时使用非阻塞操作系统调用,从而始终保持单线程 澄清一下:JS引擎使用线程池,即使用户只打开了一个窗口和一个选项卡 编辑

我知道现代浏览器的JS工程师(如V8、Spidermonkey、Chakra等)在内部使用线程池,即使只有一个线程(运行事件循环)向JS程序员公开

显然,(很少使用的)Web工作者需要多个线程(或多个进程)——否则他们无法利用多个CPU核。我的问题是,除了Web工作者,使用多线程实现JS引擎还有什么好处

为什么JS引擎不能在内部依赖JS程序员使用的相同事件循环,在需要执行任何IO时使用非阻塞操作系统调用,从而始终保持单线程

澄清一下:JS引擎使用线程池,即使用户只打开了一个窗口和一个选项卡


编辑:答案如下

脚本引擎的许多部分都可以从并行化中获益,因为它们可以针对脚本的不同部分同时运行,或者相互关联:

  • 解析
  • 汇编
  • JIT,优化
  • 调试/记录/分析
  • 垃圾收集
  • 图形

这甚至不涉及在不同使用环境(工作脚本、浏览上下文)的多个引擎实例之间共享。

浏览器同时查看多个网页?@EdHeal我编辑了我的问题以澄清问题。@max即使只有一个选项卡,浏览器UI也可能在另一个进程中使用JS。@Oriol“在另一个进程中使用JS”是什么意思?我问的是JS引擎本身,它不是用JavaScript编写的。浏览器执行的唯一JS代码是HTML页面内联或加载的脚本。所有这些代码都在一个线程中运行,但对并行执行的特殊支持(如Web Workers)除外。一个可能的用例是在不同的线程上运行GC是IO完全是单线程的,还是多线程的好处?这在很大程度上取决于特定类型的IO,而且不一定符合js引擎本身的优点。联网通常使用非阻塞操作系统调用完成,而并行文件IO通常需要线程。然后是与浏览器的其他组件(如DOMs或渲染管道)的通信,这些组件也在多线程设计中实现。