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

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

相关文章:

  • Unity Dots理论学习-4.ECS有关的模块(3)
  • 厘米和磅的转换关系
  • AI-Engine-Direct-Helper 快速上手及环境配置
  • FPGA简介|结构、组成和应用
  • C++、Dijkstra实现导航系统设计——课设
  • JavaScript 发起网络请求
  • AN 433:源同步接口的约束与分析
  • 【前端】自己从头实现一个gpt聊天页面
  • AI向量数据库之LanceDB快速介绍
  • 数据仓库与数据挖掘记录 三
  • stm32小白成长为高手的学习步骤和方法
  • 在C++的DLL文件中定义的结构体,在DLL外可以使用吗,如何使用?
  • 【3分钟极速部署】在本地快速部署deepseek
  • 基于 FPGA 的嵌入式系统硬件逻辑优化技术探究
  • Android 原生层SurfaceView截屏
  • 力扣刷题(数组篇)
  • DeepSeek本地部署详细指南
  • docker 逃逸突破边界
  • docker 部署nginx,nginx 504
  • ONES 功能上新|ONES Copilot、ONES TestCase、ONES Wiki 新功能一览
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略
  • 加拿大总理宣布新内阁名单
  • 首映|奥斯卡最佳国际影片《我仍在此》即将公映
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准
  • 特朗普开启第二任期首次外访:中东行主打做生意,不去以色列
  • 青海规范旅游包车行为:不得引导外省籍旅游包车违规驻地运营