详解 WebWorker 的概念、使用场景、示例

前言

提到 WebWorker,可能有些小伙伴比较陌生,不知道是做什么的,甚至不知道使用场景,今天这篇文章就带大家一起简单了解一下什么是 webworker!

概念

WebWorker 实际上是运行在浏览器后台的一个单独的线程,因此可以执行一些耗时的操作而不会阻塞主线程。WebWorker 通过与主线程之间传递消息实现通信,这种通信是双向的。WebWorker不能直接访问 DOM,也不能使用像 window 对象这样的浏览器接口对象,但可以使用一些WebWorker 标准接口和 Navigator 对象的部分属性和方法。

为什么使用WebWorker?

  1. 提高应用响应能力:主线程被独占执行一些耗时的计算或操作时,会导致UI无响应。WebWorker 可以把这些任务转移到后台线程,从而保证主线程的运行,提高应用的响应能力。
  2. 充分利用多核CPU:现代CPU都是多核的,WebWorker 可以让 Web 应用利用多核 CPU 的并行计算能力,充分发挥计算机硬件性能。
  3. 避免渲染阻塞:JavaScript 运行在主线程,如果主线程一直占用,就无法执行 GUI 渲染任务,导致界面渲染受阻。WebWorker 把一些费时任务分流到后台线程就可以避免这一问题。
  4. 后台持续运行:WebWorker 所在后台线程可持续运行,即使页面被挂起或最小化,任务仍在后台执行,非常适合一些需要长时间运行的操作。

使用场景

一般来说,当遇到如下几种情况时可以考虑使用 WebWorker:

  1. 大量数据的计算/处理:比如图像处理、数据分析等
  2. 长时间运行的操作:如一些复杂的数学计算
  3. 非阻塞式操作:希望执行一些耗时操作时不阻塞主线程

示例

假设我们有一个需要计算斐波那契数列的任务,我们可以使用 Web Worker 来进行计算,以避免阻塞主线程。以下是一个简单的示例:

主线程

主线程创建 worker 实例,向子线程通过 postMessage 发送消息,通过 onmessage 监听子线程返回的数据。

  const myWorker = new Worker('./worker.js')

  myWorker.onmessage = function (e) {
    console.log('Fibonacci result:', e.data)
  }

  myWorker.postMessage(40) // 请求计算斐波那契数列的第40项

worker.js

在同级目录下创建 worker.js文件,通过 onmessage 接收主线程发来的数据,计算后通过postMessage 将计算结果返回主线程。

self.onmessage = function (e) {
  const n = e.data
  let a = 0,
    b = 1,
    temp
  for (let i = 2; i <= n; i++) {
    temp = a
    a = b
    b = temp + b
  }
  self.postMessage(b)
}

运行结果

可以看到主线程打印出 webworker 计算的运行结果

Vue、React项目使用

接下来为大家演示 vue 以及 react 项目如何使用

Vue使用

vue版本:"vue": "^2.6.14",vue-cli版本:@vue/cli 5.0.8安装 worker-loader

页面使用

<template><div>我的页面</div></template>
<script>
export default {
  name: 'MyselfView',
  data() {
    return {
      worker: null,
    }
  },
  mounted() {
    // 创建 WebWorker 实例
   this.worker = new Worker(new URL('./worker.js', import.meta.url))
    console.log('worker: ', this.worker)
    this.worker.postMessage(40) // 请求计算斐波那契数列的第40项

    this.worker.addEventListener('message', (event) => {
      console.log('Fibonacci result:', event.data)
    })
  },
  beforeDestroy() {
    // 组件销毁时终止 WebWorker
    this.worker.terminate()
  },
}
</script>

worker.js

// worker.js
self.addEventListener('message', (e) => {
  console.log('e: ', e)
  const n = e.data
  let a = 0,
    b = 1,
    temp
  for (let i = 2; i <= n; i++) {
    temp = a
    a = b
    b = temp + b
  }
  self.postMessage(b)
})

效果 

React使用 

react版本: "react": "^18.2.0"

import React, { useEffect } from 'react'
// import WorkerScript from './worker.worker.js'

const Demo = () => {
  useEffect(() => {
    const worker = new Worker(new URL('./worker.worker.js', import.meta.url))

    worker.onmessage = function (e) {
      console.log('Fibonacci result:', e.data)
    }
    worker.postMessage(40) // 请求计算斐波那契数列的第40项
    // 使用 worker ...
    return () => worker.terminate()
  }, [])

  return (
    <div>
      <p>count的值</p>
    </div>
  )

效果

 

注意

由于我们在项目开发时,使用不同的打包工具(vite/webpack)。幸运的是,最新版的vite/webpack都支持Web Worker了。

我们可以通过:new URL()的方式 --vite/webpack都支持

new Worker(
  new URL(
    './worker.js', 
    import.meta.url
  )
);

总结

WebWorker是一种在 Web 应用中实现多线程运行的技术,可以将耗费 CPU 的任务交给后台线程处理,避免阻塞主线程,从而提高Web应用的响应性能和用户体验。 总之,WebWorker的引入解决了Web应用长期以来在单个线程中运行所带来的诸多问题,有效提升了Web应用的运行性能和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493884.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opengl草稿复习,承上启下

目录 1、链接文件夹中的cpp 2、链接资源到输出目录 3、多编译目标 4、cmakelist添加库 4、添加glfw和glad 5、glfw运行 6、NDC、VBO、VAO 7、渐变三角形 8、渲染两个三角形 9、渲染两个三角形&#xff0c;同时基于原来颜色进行渐变 1、链接文件夹中的cpp cmake_minimu…

跨站脚本攻击

跨站脚本攻击又称XSS攻击&#xff0c;是代码注入攻击的一种。利用XSS漏洞&#xff0c;攻击者可以窃取Cookies或劫持会话&#xff0c;或注入恶意 HTML 或 JavaScript 代码到页面中&#xff0c;又或者将当前页面重定向至一个攻击者搭建的恶意网站。XSS漏洞的产生多是因为网站开发…

Java 枚举(概念+枚举的使用+源码分析)

文章目录 一、枚举1.概念2.使用1.switch语句2.Enum类中的方法3.枚举无法反射 一、枚举 1.概念 将一组常量组织到一起&#xff0c;统一进行管理避免了定义常量时&#xff0c;可能发生的歧义枚举更加安全枚举不可继承&#xff0c;无法扩展 public enum TestEnum {//枚举对象&am…

第四届数字信号与计算机通信国际学术会议(DSCC 2024)

#高录用&#xff0c;稳检索# #高校背书&#xff0c;更可靠# DSCC 2024已通过SPIE出版社审核&#xff0c;ISSN号已确定&#xff1a;ISSN: 0277-786X&#xff0c;往届均已见刊EI检索&#xff01; 第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 …

ROS 2边学边练(2)-- 咱也玩玩Turtlesim

同ROS 1一样&#xff0c;Turtlesim(小海龟)例程往往是大家首次熟悉ROS世界的唯一不二之选&#xff08;如同刚接触编程的同学&#xff0c;老师会让大家打出“Hello World”的道理一样&#xff09;&#xff0c;很多教学视频及书籍也同样如此&#xff0c;为何&#xff1f;麻雀虽小…

跨境必看的TikTok养号保姆式教程

TikTok养号的重要性不必多少&#xff0c;不仅可以在创号初期保障账号安全&#xff0c;后期的账号流量也需要以前期养好账号为前提。下面就给大家分享如何养号的真实操作攻略&#xff01; 一、为什么要养号 &#xff08;1&#xff09;提高系统推荐精准度 系统不了解新账户人设…

LangChain核心概念与组件

Chains Chains可以让你按照一定的顺序和逻辑来执行不同的任务。Chains有以下四种类型&#xff1a; 类型作用LLMChain用于在语言模型周围添加一些功能的简单Chain&#xff0c;它由一个PromptTemplate和一个语言模型&#xff08;LLM或chat model&#xff09;组成&#xff0c;它…

初识C++(二)引用,内联函数,auto

目录 1.引用的概念与用法&#xff1a; 1.1引用特性&#xff1a; 1.2使用场景 1.2.1做参数 1.3传值、传引用效率比较 1.4引用做返回值 1.5引用和指针的对比 2.内联函数 3.auto关键字 4. 基于范围的for循环(C11) 5.指针空值nullptr(C11) 1.引用的概念与用法&#xff1a;…

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图&#xff0c;Midjourney&#xff0c;gittimg.ai&#xff0c;Stable Diffusion等一些绘图AI工具&#xff0c;感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具&#xff0c;真是完美&#xff0c;文末教大家如何用gpt提词 Midj…

浮动布局与定位布局

目录 前言: 浮动布局&#xff08;Float Layout&#xff09;: 定位布局&#xff08;Positioning Layout&#xff09;: 1.传统布局: 1.1文档流布局: 1.1.1基本的布局方式: 1.1.2 块级元素: 1.1.3调整元素: 1.2浮动布局: 1.2.1浮动布局允许元素向左或向右浮动&#xff0c;使…

docker启动卡死问题排查

问题&#xff1a;输入docker ps 或则vession 卡死&#xff0c;无任何输出 排查思路如下&#xff1a; 1、查看docker状态或者日志 journalctl -u docker.service 或者 systemctl status docker 3月 20 18:23:06 dfbpmyy2 dockerd[1114]: time"2024-03-20T18:23:06.7449…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

Python算法100例-4.5 最小公倍数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序 1&#xff0e;问题描述 求任意两个正整数的最小公倍数&#xff08;Least Common Multiple&#xff0c;LCM&#xff09;。 2&#xff0e;问题分析 如…

开源博客项目Blog .NET Core源码学习(12:App.Application项目结构分析)

开源博客项目Blog的App.Application项目主要定义网站页面使用的数据类&#xff0c;同时定义各类数据的增删改查操作接口和实现类。App.Application项目未安装Nuget包&#xff0c;主要引用App.Core项目的类型。   App.Application项目的顶层文件夹如下图所示&#xff0c;下面逐…

【Java程序设计】【C00352】基于Springboot的疫情隔壁酒店管理系统(有论文)

基于Springboot的疫情隔壁酒店管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以…

大学里女生适合做什么副业?这几个小副业最适合女生

大学里女生应该做什么样的副业合适&#xff1f;对于这个问题没办法给大家确定的答案&#xff0c;毕竟每个人能做什么&#xff0c;适合什么&#xff0c;要根据每个人的性格特点特长来看。 但是女生们不管做什么&#xff0c;尽量都不要选择做廉价劳动力的赚钱方式&#xff0c;因为…

STM32串口收发单字节数据原理及程序实现

线路连接&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 程序编写&#xff1a; 在上一个博客中实现了串口的发送代码&#xff0c;这里实现串口的接收代码&#xff0c;在上一个代码的基础上增加程序功能。 Seiral.…

【搞不明白】redis和mysql、mybatisplus有啥关系

一个解决三天的bug&#xff0c;到现在也没有搞明白&#xff0c;如题&#xff0c;到底redis和mysql、mybatisplus能有啥关系。三个不相关的嘛 记录下问题&#xff1a; (框架用的Jeecgboot 3.6.0) – 学习使用 看下面的一段代码&#xff0c;是一个分页查询&#xff1a;注意引用的…

mysql数据库表字段使用desc等关键字报错及解决方法

建议尽量避开关键字&#xff01;&#xff01;&#xff01; 如果实在必须用&#xff0c;那参考下面解决办法&#xff1a; 在要用到关键字的地方加反引号标识&#xff1a;

@EnableWebMvc 导致自定义序列化器失效

目录 前言 一. 自定义序列化器失效 1.1 EnableWebMvc 的作用 1.2 EnableWebMvc 带来了什么后果 1.3 原理分析 1.4 问题解决 二. 总结 前言 在使用Swagger的时候用 到了EnableWebMvc&#xff0c;发现之前为了解决Long类型、日期类型等自定义序列化器失效了 Configurati…