web workers 是 html5 提供的真正多线程机制,用于在后台线程执行不涉及 dom 的纯逻辑任务(如大数据处理、数学计算、图像音视频处理、加密解密、实时数据处理),配合 postmessage 与 transferable objects 实现高效零拷贝通信,合理控制 worker 数量并采用结构化消息协议提升可维护性。

Web Workers 是 HTML5 提供的真正多线程机制,它让 JavaScript 能在后台线程中执行耗时任务,完全不干扰主线程的渲染与交互。只要任务不涉及 DOM 操作,就能通过 Worker 把计算压力移出去,页面自然更跟手、不卡顿。
明确哪些任务适合交给 Worker
Worker 不能操作 DOM,也不访问 window、document 等对象,所以只适合纯逻辑型任务:
- 大数据处理:解析几 MB 的 JSON/CSV、数组聚合、排序、去重
- 数学密集计算:斐波那契、素数筛、矩阵运算、物理模拟
- 图像/音视频处理:像素遍历、滤镜计算、音频 FFT、编解码预处理
- 加密解密:AES 加密、RSA 签名、哈希计算(如 SHA-256)
- 实时数据处理:传感器滤波、股票行情滑动窗口统计
用好 postMessage + Transferable Objects 减少通信开销
主线程和 Worker 之间靠 postMessage 传数据,但默认会深拷贝——尤其是 ArrayBuffer、TypedArray 这类大对象,复制很慢。关键优化是使用 Transferable Objects,把内存所有权直接移交,实现零拷贝:
主线程中:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
const buffer = new ArrayBuffer(1024 * 1024); // 1MB const view = new Uint8Array(buffer); // 填充数据... worker.postMessage(view, [buffer]); // 第二个参数表示转移所有权
Worker 中收到的就是同一块内存,无需反序列化,速度提升明显。注意:移交后主线程不能再访问该 buffer。
控制 Worker 数量,避免资源过载
每个 Worker 都是独立 JS 运行环境,占用内存和 CPU 调度资源。盲目创建多个 Worker 反而引发线程竞争和上下文切换开销:
- 优先用 navigator.hardwareConcurrency 获取设备逻辑核心数(如 8 核就设上限为 6–8 个)
- 对连续任务(如分片处理大数组),用固定大小的 Worker 池复用实例,而不是每次新建
- 简单单次任务,用完立刻 terminate;长期运行任务,监听主线程信号再优雅退出
结构清晰的通信模式更易维护
避免裸消息传递,建议约定结构化消息协议,比如:
// 主线程发送
worker.postMessage({
type: 'PROCESS_IMAGE',
payload: { width: 800, height: 600, data: imageData }
});
<p>// Worker 接收并响应
self.onmessage = function(e) {
const { type, payload } = e.data;
if (type === 'PROCESS_IMAGE') {
const result = applyFilter(payload.data);
self.postMessage({ type: 'RESULT', payload: result });
}
};</p>这样主线程可按 type 分发回调,便于扩展新任务类型,也方便调试和错误隔离。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










