0

0

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

夜晨

夜晨

发布时间:2026-01-01 23:27:08

|

341人浏览过

|

来源于php中文网

原创

web workers允许javascript在后台线程运行而不阻塞主线程,需通过外部同源js文件创建,拥有独立执行环境(无dom、localstorage等),通信仅依赖postmessage/onmessage异步消息传递,支持结构化克隆与arraybuffer转移,可调用worker.terminate()或self.close()终止,常见类型为dedicated worker(一对一)和shared worker(多页面共享)。

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

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

如何创建并启动一个 Web Worker

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

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


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

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


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

主线程与 Worker 之间如何通信

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

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

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

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

立即学习Java免费学习笔记(深入)”;

妙刷AI
妙刷AI

美团推出的一款新奇、好玩、荒诞的AI视觉体验工具

下载

如何终止 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、靠消息、记得关。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

557

2023.09.20

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

39

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

47

2025.11.27

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

529

2023.06.20

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号