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

WebWorkers在项目中的使用案例

Worker | 文档

worker 线程的关闭在主线程和 worker 线程都能进行操作,但对 worker 线程的影响略有不同。

// main.js(主线程)
const myWorker = new Worker('/worker.js'); // 创建worker
myWorker.terminate(); // 关闭worker
复制代码
// worker.js(worker线程)
self.close(); // 直接执行close方法就ok了
复制代码

无论是在主线程关闭 worker,还是在 worker 线程内部关闭 worker,worker 线程当前的 Event Loop 中的任务会继续执行。至于 worker 线程下一个 Event Loop 中的任务,则会被直接忽略,不会继续执行。

区别是,在主线程手动关闭 worker,主线程与 worker 线程之间的连接都会被立刻停止,即使 worker 线程当前的 Event Loop 中仍有待执行的任务继续调用 postMessage() 方法,但主线程不会再接收到消息。

在 worker 线程内部关闭 worker,不会直接断开与主线程的连接,而是等 worker 线程当前的 Event Loop 所有任务执行完,再关闭。也就是说,在当前 Event Loop 中继续调用 postMessage() 方法,主线程还是能通过监听message事件收到消息的

new Worker() 用于创建一个新的 Web Worker 线程。Web Worker 是浏览器提供的一种多线程机制,它可以在后台执行 JavaScript 代码,不会阻塞主线程,从而提高了 Web 应用程序的性能和响应能力。
 
以下是一个示例代码,演示了如何使用 new Worker() 创建一个新的 Web Worker 线程:
 
// 创建一个 Web Worker 线程
const worker = new Worker('worker.js');
在上述示例中,我们创建了一个名为 worker 的 Web Worker 线程,并指定了要执行的 JavaScript 文件为 worker.js。
 
需要注意的是,Web Worker 线程中不能直接访问 DOM,也不能使用一些浏览器环境中的 API(如 alert()、confirm()、prompt()、localStorage 等)。同时,Web Worker 线程和主线程之间是通过消息通信来进行交互的,要向 Web Worker 线程发送消息,可以使用 worker.postMessage() 方法;要监听 Web Worker 线程的消息,可以使用 worker.onmessage 事件。

‌一、直接引用绝对路径文件‌
若Worker脚本文件以‌静态资源形式存放‌(如public/worker.js),可直接通过路径引用:

vue2// 主线程代码

// worker.js 代码

vue3+vite+ts  //主线程代码

 // worker.js 代码

二、需要配置的情形

使用动态模块路径或需要引入第三方库时,必须通过worker-loader处理:‌

1.安装依赖‌ npm install worker-loader -D

2.配置vue.config.js‌    添加Webpack规则处理.worker.js后缀文件:

chainWebpack: config => {
 config.module .rule('worker') .test(/\.worker\.js$/) .use('worker-loader') .loader('worker-loader') .end(); 
config.module.rule('js').exclude.add(/\.worker\.js$/) 
}

 //TypeScript项目‌
//需声明Worker模块类型(创建worker.d.ts文件):

declare module '*.worker.js' { class WebWorker extends Worker { constructor(); } export default WebWorker; } }

3.案例:

主线程代码

work.js

self.onmessage=(event)=>{
  const result = event.data.reduce((acc, cur) => acc + cur, 0)
  self.postMessage(result)
  self.close()
}


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

相关文章:

  • Unity高清渲染管线
  • 在UEC++中的FReply的使用
  • 如何查看window电脑的GPU信息
  • 达梦数据库Flink CDC方案改进
  • 【PICO】开发环境配置准备
  • 使用Java爬虫按图搜索1688商品(拍立淘)
  • Ubuntu下用QEMU模拟运行OpenBMC
  • 解决Jenkins中Vue前端打包时package.json文件冲突的两种常见问题
  • 实力认证|“AORO M6-Pro在危急特场景的应用”被评为AI标杆产品典型案例
  • Qt QPainter使用方法
  • Qt事件处理(处理鼠标事件、键盘事件、定时器事件、窗口移动和大小变化事件)
  • Postman下载安装(Windows 11 专业版)
  • 【递归与动态规划(DP) C/C++】(1)递归 与 动态规划(DP)
  • 数据结构5(初):续写排序
  • 手搓全自动文章多平台发布系统:2、重要模块的设计
  • 国产化适配 - YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析
  • R语言交互项-formula
  • 【C++】STL库_list 的模拟实现
  • 大数据学习栈记——HBase操作(shell java)
  • Couchbase存储引擎Magma和Couchstore