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

nodejs 038: Js Worker线程消息传递 Worker.postMessage() Worker.postMessage()

  • worker.postMessage() 是 Web Workers API 的一部分,用于在主线程和 Worker 线程之间进行通信。通过这种方法,可以在不同的执行上下文(例如主线程与Web Worker之间)安全地传递消息。
Layer 1 worker.postMessage Worker Main worker=new Worker() self.addEventListener('message', async (event) => {}) self.postMessage({status: 'message_worker2main'}); 'message', onMessageReceived); worker.addEventListener( 主线程发送消息 主线程接收消息 worker线程发送消息 worker程接收消息

基本概念

  • Web Worker:允许在后台线程中运行脚本而不干扰用户界面。这非常适合执行计算密集型任务,如数据处理或运行复杂算法,而不会冻结网页。
  • 主线程与Worker之间的通信:由于JavaScript是单线程的,Web Worker提供了一种机制来利用多核CPU的优势。主线程和Worker之间可以通过postMessage()方法发送消息,并使用onmessage事件监听器接收消息。

使用方法

在主线程中使用

当你想从主线程向Worker发送消息时,可以使用如下方式:

const worker = new Worker('worker.js'); // 创建一个新的Worker实例
worker.postMessage({cmd: 'start', value: 10}); // 发送消息到Worker

在这个例子中,我们创建了一个新的Worker实例并给它发送一个包含命令(cmd)和值(value)的对象。

在Worker内部使用

同样,Worker也可以使用postMessage()方法将消息发送回主线程:

self.postMessage({status: 'progress', progress: 50}); // 向主线程发送消息

这里的self指的是Worker全局作用域,等同于在Worker环境中使用this关键字。

消息内容

  • 可以发送基本类型的数据、对象、数组等。对于复杂的数据结构,JavaScript会自动执行结构化克隆算法来复制这些数据,这意味着不需要担心原始数据是否会被修改。
  • 对于需要高效传输大量数据的情况,可以使用ArrayBuffer对象,这样可以避免不必要的数据复制。

示例代码

// 主线程监听来自主线程的消息事件
self.addEventListener('message', async (event) => {
    let output = await func(event.data, {
        // 其他参数...
    });

    // 将翻译结果发送回主线程
    self.postMessage({
        status: 'complete',
        output: output,
    });
});
  • 这里,self.postMessage()被用来将进度更新和最终的翻译结果从Worker发送回主线程。每当有新进展时,都会调用self.postMessage(),将相关信息作为参数传递,从而让主线程能够根据这些信息更新UI或其他状态。

注意事项

  • 数据传递是异步的,这意味着postMessage()不会阻塞当前线程等待响应。
  • 如果你需要从主线程或Worker接收到消息后执行特定操作,必须设置相应的onmessage事件处理器。

相关文章:

  • Django快速入门
  • 【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
  • 归并排序的应用—计算逆序对的个数
  • 使用 pgvector 实现 PostgreSQL 语义搜索和 RAG:完整指南
  • 长视频生成、尝试性检索、任务推理 | Big Model Weekly 第56期
  • 为AI聊天工具添加一个知识系统 之107 详细设计之48 理解和角色
  • 从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
  • Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第五节】
  • MySQL数据库三:操作数据库(二)
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十节】
  • mac docker镜像加速正确配置方式
  • 【MySQL常见疑难杂症】常见文件及其所存储的信息
  • 尚硅谷爬虫note005
  • 基于Knative的无服务器引擎重构:实现毫秒级冷启动的云原生应用浪潮
  • 数据结构笔记之时间复杂度O(n)中的O是什么的缩写,为什么要用O这个字母?
  • 快速设置 Docker 网络代理配置
  • 手机ROM是什么
  • 网络安全|网络安全学习方法
  • 【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)(基础列表采用读取WORD表格单元格数据,非采用切片组合)
  • 杜前任宁波中院代理院长,卸任宁波海事法院院长
  • 最近这75年,谁建造了上海?
  • 第1现场|无军用物资!伊朗港口爆炸已遇难40人伤1200人
  • 民生访谈|宝妈宝爸、毕业生、骑手……上海如何为不同人群提供就业保障
  • 商超展销延长、专区专柜亮相……上海“外贸拓内销”商品与市民见面
  • 野猪穿过江苏电视台楼前广场,被抓捕后送往红山森林动物园