Skip to content

进程和线程跟前端有什么关系? ​

进程是操作系统分配资源的单位,有自己的内存空间。线程是进程里的执行流,同一进程的线程共享地址空间。浏览器里一个站点往往有自己的渲染进程,页面的 JavaScript 主线程负责跑脚本和计算布局。

原理 ​

渲染进程崩了,不该带走整个浏览器,这是多进程架构的隔离。每个页面里,主线程如果被长任务占住,点击要等它空出来。Web Worker 是同一页面里的后台线程,没有 DOM,通过消息通信。见 运行时优化。

Node 里一个进程是一个事件循环。worker_threads 共享一部分内存的能力比进程间通信更细,集群模式则是多个进程。不要把 Worker 说成新的进程,也不要把进程内存说成所有请求共享的全局变量就能跨机器。

切换线程有成本,共享内存还要处理同时写入。前端大多数等待是网络,不是 CPU,所以先用异步 I/O,而不是先开线程。

追问 ​

和协程、async 的差别?

async 函数仍在主线程上跑,只是在等待时让出调用栈。它不会把计算放到另一颗核上。真正并行用 Worker 或别的进程。

标签页之间为什么不能直接读变量?

它们可能在不同进程里,内存不共享。能用的是 localStorage 事件、BroadcastChannel 和服务器。见 本地存储。

易错点 ​

  • 说 JavaScript 有多线程 DOM。DOM 在主线程,Worker 碰不到。
  • 开一堆 Worker 却不说消息拷贝的成本。
  • 把浏览器进程模型和 Node 集群混成同一张图。

相关 ​