javascript如何实现web workers_它们如何通信

发布时间 - 2026-01-01 00:00:00    点击率:
Web Workers允许JavaScript在后台线程运行而不阻塞主线程,需通过外部同源JS文件创建,拥有独立执行环境(无DOM、localStorage等),通信仅依赖postMessage/onmessage异步消息传递,支持结构化克隆与ArrayBuffer转移,可调用worker.terminate()或self.close()终止,常见类型为Dedicated Worker(一对一)和Shared Worker(多页面共享)。

Web Workers 让 JavaScript 能在后台线程中运行脚本,不阻塞主线程(比如页面渲染、用户交互)。实现它不难,关键在于理解“独立执行环境”和“基于消息的通信”这两个核心点。

如何创建并启动一个 Web Worker

Worker 必须从外部 JS 文件加载(不能是内联脚本),且同源。浏览器会为它分配独立的全局上下文(self 代替 window),没有 DOM、documentlocalStorage 等 API。

  • 新建一个文件,例如 worker.js,写入要后台执行的逻辑:


self.onmessage = function(e) {
const result = e.data * 2;
self.postMessage(result);
};

  • 在主页面中创建 Worker 实例并发送消息:


const worker = new Worker('worker.js');
worker.postMessage(42); // 发送数字 42
worker.onmessage = function(e) {
console.log('收到结果:', e.data); // 输出 84
};

主线程与 Worker 之间如何通信

通信只能通过 postMessage()onmessage 进行,**是异步、事件驱动、纯消息传递**,不共享内存。所有数据都会被结构化克隆(structured clone),意味着大多数基本类型、数组、对象、Map、Set 等可传,但函数、DOM 节点、undefined、Symbol 等不行。

  • 发送消息用 worker.postMessage(data)self.postMessage(data)
  • 监听消息统一用 onmessage = function(e) { ... },其中 e.data 是传来的数据
  • 支持传输 ArrayBuffer 等可转移对象(transferable),大幅提升大数据量处理效率(如图像、音频):

// 主线程中发送并转移 ArrayBuffer
const buffer = new ArrayBuffer(1024);
worker.postMessage(buffer, [buffer]); // 第二个参数表示转移所有权

注意:一旦转移,原上下文不能再访问该 buffer。

如何终止 Worker

避免内存泄漏或无用运行,记得及时关闭。

  • 主线程调用 worker.terminate() —— 立即停止,不触发 Worker 内部清理逻辑
  • Worker 自己调用 self.close() —— 安全退出,适合完成任务后主动结束

Worker 结束后,其引用可被 GC 回收;但未 terminate 的 Worker 仍驻留内存,即使页面隐藏。

常见类型:Dedicated Worker vs Shared Worker

日常用的是 Dedicated Worker(一对一),每个实例只与创建它的脚本通信。Shared Worker 则允许多个页面/脚本共用一个 Worker(需同源),通过 port 通信:

  • Shared Worker 构造时需指定 name:new SharedWorker('shared.js', 'myWorker')
  • 必须显式调用 port.start() 启动消息通道
  • 适合跨 iframe 或多标签页共享状态或轮询逻辑(如统一通知服务)

不过多数场景用 Dedicated 就够了,更简单、更可控。

基本上就这些。Web Workers 不复杂但容易忽略通信边界和生命周期管理 —— 记住:没共享内存、没 DOM、靠消息、记得关。


# javascript  # java  # js  # 大数据  # 浏览器  # ai  # win  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 五星评分(包括半颗星评分)实例代码  详解MySQL数据库的安装与密码配置  如何用PHP工具快速搭建高效网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  node.js报错:Cannot find module 'ejs'的解决办法  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  javascript中的try catch异常捕获机制用法分析  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel如何自定义分页视图?(Pagination示例)  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何有效防御Web建站篡改攻击?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何用搬瓦工VPS快速搭建个人网站?  Java垃圾回收器的方法和原理总结  网站页面设计需要考虑到这些问题  简单实现Android验证码  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  linux top下的 minerd 木马清除方法  昵图网官方站入口 昵图网素材图库官网入口  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  米侠浏览器网页背景异常怎么办 米侠显示修复  Laravel如何配置任务调度?(Cron Job示例)  如何在自有机房高效搭建专业网站?  如何彻底删除建站之星生成的Banner?  制作旅游网站html,怎样注册旅游网站?  Laravel如何使用Telescope进行调试?(安装和使用教程)  如何基于云服务器快速搭建个人网站?  重庆市网站制作公司,重庆招聘网站哪个好?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  C#如何调用原生C++ COM对象详解  网站图片在线制作软件,怎么在图片上做链接?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Linux系统运维自动化项目教程_Ansible批量管理实战  如何在万网主机上快速搭建网站?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  如何在局域网内绑定自建网站域名?  西安专业网站制作公司有哪些,陕西省建行官方网站?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  简历没回改:利用AI润色让你的文字更专业  如何在IIS服务器上快速部署高效网站?  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  ,怎么在广州志愿者网站注册?  深圳网站制作平台,深圳市做网站好的公司有哪些?