Web Workers 是基于消息传递的后台线程机制,实现主线程不阻塞的多线程编程;其通过 postMessage/onmessage 通信,数据经结构化克隆复制,支持 Transferable Objects 零拷贝,天然规避竞态条件。

Web Workers 是 JavaScript 提供的一种在后台线程中运行脚本的机制,它让开发者能真正实现多线程编程——主线程不被阻塞,耗时任务(如大量计算、数据处理)可交给独立线程执行。
Web Workers 的核心特点
它不是“共享内存式”多线程,而是基于消息传递(message passing)的隔离线程模型:
每个 Worker 运行在独立的全局上下文中,无法直接访问 DOM、window 或 document主线程与 Worker 之间通过 postMessage() 和 onmessage 通信,数据通过结构化克隆算法复制(非共享引用)Worker 脚本必须来自同源 URL(不能是内联脚本或 data URL)支持专用 Worker(Dedicated Worker)、共享 Worker(Shared Worker)和 Service Worker,最常用的是 Dedicated Worker
如何创建并使用一个专用 Worker
分两步:编写 Worker 脚本 + 在主线程中实例化并通信:
新建文件 worker.js,写入要后台执行的逻辑,例如:
self.onmessage = function(e) {
const result = e.data * e.data;
self.postMessage(result);
};
主线程中:
const worker = new Worker('worker.js');
worker.postMessage(123); // 发送数据
worker.onmessage = function(e) { console.log('结果:', e.data); };
注意:Worker 内部用 self 代替 window,可用 fetch、setTimeout、WebAssembly 等,但不能用 alert、localStorage(部分浏览器限制)
为什么说它“模拟”了多线程而非真正共享内存?
JavaScript 引擎本身是单线程的,V8 等引擎通过操作系统级线程来托管 Worker,但 JS 层面不暴露线程控制权。所有跨线程数据都需序列化/反序列化:
立即学习“Java免费学习笔记(深入)”;
传对象时,只有可克隆属性被复制(函数、undefined、Symbol、Promise 等会被忽略)大数组可使用 Transferable Objects(如 ArrayBuffer)零拷贝传输,提升性能:worker.postMessage(buffer, [buffer]);没有锁、没有共享变量,天然规避了竞态条件——这也意味着它不适合需要频繁读写同一状态的场景
适用与不适用的场景
适合:图像处理、加密解密、JSON 解析/生成、游戏 AI 计算、离线数据预处理等 CPU 密集型任务。
不适合:需要操作 DOM 的任务(必须回调主线程)、I/O 主导且不耗 CPU 的简单请求(fetch 本身已是异步,无需 Worker)、轻量级逻辑(启动 Worker 有开销,约几毫秒)。
基本上就这些。Web Workers 不复杂但容易忽略它的通信本质——它不是让 JS 变成多线程语言,而是给你开了一个“不打扰用户界面”的新窗口去干活。
以上就是什么是JavaScript的Web Workers_它如何实现多线程编程?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1542406.html
微信扫一扫
支付宝扫一扫