html5 web workers 是基于消息传递、进程级隔离的轻量级并行机制,不共享内存,每个 worker 拥有独立运行上下文,通信依赖 postmessage 和 transferable 实现零拷贝优化。

HTML5 Web Workers 的并发计算模型不是传统意义上的“多线程共享内存”,而是基于消息传递、进程级隔离的轻量级并行执行机制。它不改变 JavaScript 单线程本质,但在浏览器内实现了真正可调度的后台执行单元,让 CPU 密集任务能与 UI 渲染并行运行。
Worker 是独立 JS 执行环境,不是线程共享变量
每个 Worker 拥有自己完整的 JavaScript 运行上下文:独立的全局对象(self)、堆内存、事件循环和调用栈。它无法访问主线程的 window、document 或任何 DOM 节点,也不能读写主线程变量——所有数据交换必须通过 postMessage() 显式发送,且默认是结构化克隆(深拷贝)。
- 主线程和 Worker 之间没有共享内存,不存在竞态条件或锁机制
- 通信本质是异步消息队列,类似微服务间 RPC,而非多线程共用堆
- 这种设计规避了复杂同步问题,也天然支持“分布”逻辑(即使只在单机)
并发靠实例数量 + 操作系统调度实现
浏览器将每个 Worker 实例交由底层 OS 线程池调度,实际并发度取决于:
– 设备逻辑核心数(可通过 navigator.hardwareConcurrency 获取)
– 浏览器对 Worker 创建频次的限制(如 Safari 会节流)
– 内存与上下文切换开销
- 创建 10 个 Worker 并不等于 10 个 CPU 核心满载,可能被 OS 合并调度
- 频繁新建/销毁 Worker 开销大,推荐复用固定数量的 Worker 实例(Worker Pool)
- 长期运行任务应监听主线程信号优雅退出,避免资源泄漏
任务可分割 + 无副作用是并发前提
要发挥 Worker 并发优势,原始任务必须满足两个关键条件:
- 数据可分片:如大数组按索引区间切分、图像按区域划分、时间序列按窗口拆解
- 计算无副作用:纯函数式逻辑(输入确定 → 输出唯一),不依赖外部状态或修改全局变量
例如计算 1 亿个数的平方和,主线程把数组切成 4 段,分别发给 4 个 Worker;每个 Worker 独立算出部分和,再汇总——整个过程无依赖、无冲突、可并行。
通信效率决定实际吞吐,Transferable 是关键优化
默认 postMessage() 对 ArrayBuffer、TypedArray 等大数据会触发深拷贝,成为性能瓶颈。使用 Transferable Objects 可移交内存所有权,实现零拷贝:
- 主线程发送时:
worker.postMessage(view, [buffer]) - Worker 收到后直接操作同一块内存,主线程立即失去访问权
- 适合图像像素处理、加密密钥运算、大型数值矩阵等场景
不优化通信,Worker 反而比主线程更慢;用好 Transferable,才能真正释放多核潜力。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











