当前位置: 首页 > news >正文

工作者线程通信方式对比( postMessage()、MessageChannel、BroadcastChannel)

工作者线程通信方式对比

特性postMessage()MessageChannelBroadcastChannel
通信模式点对点(直接通信)点对点(通道通信)一对多(广播通信)
通信方向单向(发送到特定接收方)双向(通过端口相互通信)单向广播(发送给所有订阅者)
创建方式内置于WorkerWindowiframe等对象通过new MessageChannel()创建通过new BroadcastChannel(name)创建
主要用途与特定工作者或窗口通信两个上下文之间的专用通道同源下的多个上下文间广播消息
连接建立隐式(通过目标对象的引用)显式(通过传递端口)隐式(通过共享频道名称)
消息路由直接发送到目标对象通过port1port2端口发送到所有同名的频道订阅者
典型应用场景主线程与 Worker 通信两个 Worker 之间直接通信多个标签页或窗口间同步状态
关闭方式无法单独关闭通信,需终止工作者可关闭单个端口或整个通道关闭频道或关闭上下文
兼容性广泛支持(包括 IE10+)广泛支持(包括 IE10+)现代浏览器(IE不支持)
消息事件监听onmessageaddEventListener('message', ...)port.onmessageaddEventListener('message', ...)onmessageaddEventListener('message', ...)
传递机制结构化克隆算法(支持大多数数据类型)结构化克隆算法结构化克隆算法
性能特点直接高效,适合固定通信对适合需要双向通信的专用链路广播开销较大,适合低频同步

使用示例

1.postMessage()

javascript

// 主线程 const worker = new Worker('worker.js'); worker.postMessage('Hello Worker'); // Worker 线程 self.onmessage = (e) => { console.log(e.data); // 'Hello Worker' self.postMessage('Hello Main'); };

2.MessageChannel

javascript

// 创建通道 const channel = new MessageChannel(); // 端口1监听 channel.port1.onmessage = (e) => { console.log('Port1 received:', e.data); }; // 通过端口2发送 channel.port2.postMessage('Hello through channel'); // 可将端口传递给其他工作者 worker.postMessage({ port: channel.port2 }, [channel.port2]);

3.BroadcastChannel

javascript

// 所有需要通信的上下文 const channel = new BroadcastChannel('app-channel'); // 发送广播 channel.postMessage({ type: 'update', data: 'new data' }); // 接收广播 channel.onmessage = (e) => { console.log('Received:', e.data); }; // 关闭 channel.close();

选择建议

  1. 使用postMessage():当需要与特定的工作者、窗口或 iframe 进行直接通信时

  2. 使用MessageChannel:当需要两个上下文之间建立专用的双向通信通道时

  3. 使用BroadcastChannel:当需要在同源下的多个上下文(标签页、工作者等)之间广播消息时


这三种方式可以结合使用,例如通过postMessage()传递MessageChannel的端口,实现在不同工作者之间建立直接通信通道。

http://www.jsqmd.com/news/104404/

相关文章:

  • 合规即代码的延伸:国产 DevOps 平台如何利用平台扩展能力,自动验证信创基础设施的配置合规性
  • BJ-字符串
  • GSV1015@ACP#1015/2015产品规格详解及产品应用分享
  • 从“连接器”到“封装载体”:高多层板的进化
  • python编程实战(三)
  • [创业之路]-736-在组织中,责任意味着:“这件事成与败,板子打在我身上。”责任 = 该做的事(义务) + 出事我来扛(担当)
  • 【光子 AI】《Jeff Dean 传记:Google 工程师的传奇人生》
  • 模型性能监控仪表盘:实时追踪EmotiVoice服务状态
  • [创业之路]-736-目标和结果导向:CTO职责及完成职责要求所具备的能力要求:用技术驱动业务增长、构建长期竞争力,并对技术投入的 ROI(投资回报率)负责。不是“管代码的头”,而是“技术变现的操盘手
  • 校园快递代取|基于springboot + vue校园快递代取系统(源码+数据库+文档)​
  • 基于SpringBoot的高校迎新管理系统毕业设计项目源码
  • 化工厂气象站:国产防爆气象站
  • 如何用EmotiVoice创建会‘生气’或‘开心’的AI角色?
  • 如何设计一个盲盒系统
  • 当代中国哲学之光:颜廷利——引领东方智慧走向世界的思想巨擘
  • 【赵渝强老师】PostgreSQL的逻辑存储结构
  • 名藏大道,悟则大同——《升命学说》中的分享智慧与文明升维
  • 成都集成墙板源头厂家哪家靠谱?求专业推荐 - 朴素的承诺
  • 2025年北京制冷螺杆压缩机维修权威推荐榜单:制冷离心机压缩机/压缩机/压缩机耐氟电机维修精选 - 品牌推荐官
  • EmotiVoice语音合成系统灰度经验复盘与知识沉淀
  • vue基于springboot的医院物资器械维修巡检管理系统的设计与开发没论文
  • 【赵渝强老师】史上最详细的PostgreSQL体系架构介绍
  • vue基于springboot的在线数据二手闲置商品交易平台
  • JavaScript 上下文间消息传递方式对比(结构化克隆算法、可转移对象、共享数组缓冲区)
  • 基于springboot服装商店管理与分析系统毕业设计项目源码
  • 2025十大益生菌品牌选购干货:幽定妥入选TOP10,国家认可效果稳 - 博客万
  • vue基于springboot的学习资料资源分享共享平台的研究和实现
  • PCB焊锡桥连与拉尖成因分析与工艺优化方案
  • 中文语音合成哪家强?EmotiVoice开源方案实测分享
  • 2025年温州文武学校排行榜,苍南县飞林文武学校口碑怎么样 - myqiye