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

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事件处理器。

http://www.kler.cn/a/549288.html

相关文章:

  • 图像生成GAN和风格迁移
  • mysql读写分离与proxysql的结合
  • FOT(Forest-of-Thought):增强大型语言模型推理能力的新框架
  • Docker安装Kafka(不依赖ZooKeeper)
  • 【Linux】Ubuntu Linux 系统 ——PHP开发环境
  • Netty的基本架构详解
  • 【第12章:深度学习与伦理、隐私—12.1 AI伦理原则与偏见检测的方法与实践】
  • 第437场周赛:找出长度为 K 的特殊子字符串、吃披萨、选择 K 个互不重叠的特殊子字符串、最长 V 形对角线段的长度
  • 应用分层、三层架构和MVC架构
  • 微信小程序的请求函数封装(ts版本,uniapp开发)
  • Deep seek学习日记1
  • 8. Docker 常规安装简介(安装 Tomcat ,安装 MySQL,安装Redis 同时指定安装的版本)
  • WebMvcConfigurer 介绍
  • 有关计算机的英语单词、短语、句子
  • Python 文本探秘:正则表达式的易错迷宫穿越 -- 7. 正则表达式
  • Redis初阶笔记
  • Qt的QListWidget样式设置
  • Unity中如何判断URL是否为RTSP或RTMP流
  • C语言----共用体
  • Linux基础21-C语言篇之流程控制Ⅱ【入门级】