Web Worker 应用场景和实现

news2025/1/15 17:25:38

应用场景

   众所周知JavaScript是单线程的语言,所有任务只能在一个线程上完成,一次只能做一件事,即前面的任务还没有完成,后面的任务只能排队等待。如果前面的任务需要执行一些大数据量的计算,页面就会出现卡顿、点击无反应、甚至页面崩溃等现象。这对用户体验而言是非常糟糕的。

    在这种情况下,Web Worker可以为js提供一个多线程环境 ,主线程可以将一些耗时、复杂的计算任务分配给Worker线程 ,两者可以同时运行,互不干扰,等到Worker线程任务完成后,再把结果发送给主线程。这样Worker线程负责耗时、复杂的计算任务,主线程主要负责界面渲染不会被阻塞,使得用户体验更流畅

例如复杂的计算,上传大文件,请求耗时和计算耗时的都可以用

 方法介绍

主线程
1、Worker.onerror:指定 error 事件的监听函数。
2、Worker.onmessage:指定 message 事件的监听函数,发送过来的数据在Event.data属性中。
3、Worker.onmessageerror:指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时,会触发这个事件。
4、Worker.postMessage():向 Worker 主线程发送消息。
5、Worker.terminate():立即终止 Worker 线程

子线程
1、self.name: Worker 的名字。该属性只读,由构造函数指定。
2、self.onmessage:指定message事件的监听函数。
3、self.onmessageerror:指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时,会触发这个事件。
4、self.close():关闭 Worker 线程。
5、self.postMessage():向产生这个 Worker 主线程发送消息。
6、self.importScripts():加载 JS 脚本




vue 集成

npm i worker-loader -D

在vue.config.js中引入

config.module
      .rule('worker')
      .test(/\.worker\.js$/)// 以.worker.js结尾的文件将被worker-loader加载
      .use('worker-loader')
      .loader('worker-loader')
      .end();
    config.module.rule('js').exclude.add(/\.worker\.js$/)

创建js

以上传大文件的分片为例子 test.worker.js

import SparkMD5 from 'spark-md5';
import axios from "axios";
const CancelToken = axios.CancelToken;
let source = CancelToken.source();

//监听接收主线程 worker.postMessage发送的信息 chunkList uploadIdInfo 是主线程发送的数据 存放在e.data中
onmessage = async (e) => {
  //接收主线程参数
  const {chunkList,uploadIdInfo} = e.data;
  //执行分片上传逻辑
  const promises = chunkList.map(async (chunk) => {
    const response = await axios.put(chunk.uploadUrl, chunk.chunk.file, {
      onUploadProgress: 100,
      headers: {
        'Content-Type': 'application/octet-stream'
      },
      cancelToken: source.token,
    });
    if (response.status === 200) {
      console.log('分片:' + chunk.chunkNumber + ' 上传成功');
    } else {
      console.log('上传失败:' + response.status + ',' + response.statusText);
    }
    return response;
  });
  //等待全部请求完成
  const chunks = await Promise.all(promises);
  console.log("分片上传结果======="+chunks)

  //返回给主线程请求结果 
  postMessage(JSON.stringify(chunks));//返回给主线程一定要是基本类型,不是的转成json返回
};

页面引用

import  testWorker from "./test.worker";
/**
     * 上传分片文件
     * @param {*} chunkList
     */
    async uploadChunkBase(chunkList,uploadIdInfo) {
      const result = [];
      const self = this;
     //生成一个线程
      const worker = new testWorker()
     //像子线程发送数据
      worker.postMessage({chunkList,uploadIdInfo});
     //监听子线程返回结果
      worker.onmessage = e => {
        try {
          console.log("主线程回调")
          result[i] = e.data;//返回数据
          //销毁线程
          worker.terminate();
        } catch (error) {
          console.log(`Error processing the file in worker: ${error}`);
        }
      };
      worker.onerror = (error) => {
        console.log(`Worker encountered an error: ${error}`);
      };

说明

代码是上传大文件视频,分片去上传到minio文件服务器,因为分了太多分片,请求上传的时候页面会崩溃,所以分片上传改用多线程的方式,主要逻辑就是主线程生成一个worker 向子线程发送分片上传请求,子线程去执行上传分片

举个最简单的栗子

创建了一个aa.worker.js

//监听接收主线程发送的数据
onmessage = async (e) => {
  const {param1,param2} = e.data;
  console.log("主线程数据",param1,param2)
  let result = param1+param2;
  console.log("计算相加",result)
  //返回主线程计算结果
  postMessage(result);
};

需要用到的页面引用 

import  aaWorker from "./aa.worker";
      const aaWorker1 = new aaWorker()
      let param1 = 1;
      let param2 = 1;
      aaWorker1.postMessage({param1,param2});
      aaWorker1.onmessage = e => {
        try {
          let result = e.data;
          console.log("返回结果",result)
          //销毁
          aaWorker1.terminate();
        } catch (error) {
          console.log(`Error processing the file in worker: ${error}`);
        }
      };
      aaWorker1.onerror = (error) => {
        console.log(`Worker encountered an error: ${error}`);
      };

浏览器打印数据

参考文章:

浅析Web Worker及实践_webworker-CSDN博客

Web Worker 使用教程 - 阮一峰的网络日志

Webpack 下使用 web workers 及 基本原理 和 应用场景_webpack webworker-CSDN博客

https://webpack.html.cn/loaders/worker-loader.html

使用 Web Workers - Web API | MDN

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平衡二叉树、B树、B+树、红黑树解析

目录 有序二叉树平衡二叉树构造平衡二叉树RRLLRLLR 平衡二叉树的优缺点: 2-3-4树红黑树B树B树B树、B树、红黑树的应用 有序二叉树 关于有序二叉树的详解以及 J a v a Java Java代码实现详见:二叉排序树详解并通过Java代码实现。每个节点最多有两个孩子…

后端开发刷题 | 合并k个已排序的链表

描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围&#xff1a;节点总数 0≤n≤5000&#xff0c;每个节点的val满足 ∣val∣<1000 要求&#xff1a;时间复杂度 O(nlogn) 示例1 输入&#xff1a; [{1,2,3},{4,5,6,7}] 返回值&#xff1a; …

电机foc学习渠道已开放,欢迎各位加入

凌鸥学园旨在为电机控制爱好者提供学习交流成长平台&#xff0c;缓解电控行业人才缺口扩大趋势&#xff0c;共同打造繁荣行业生态。我们将全面整合LKS MCU相关资料&#xff0c;包括开发环境、应用笔记、教学视频、学习指导等&#xff0c;并设有专业课程。 课程图&#xff1a; 除…

程序统计访问用户与百度统计访问用户相差很大-User-Agent访问列表

一、程序统计访问用户与百度统计访问用户相差很大-User-Agent访问列表 1. 站里某天的User-Agent数据日志情况 本站里某天的User-Agent数据如下列表&#xff0c;占用量最大的就是前四项&#xff0c;后面的各项数量都很少可忽略&#xff0c;因网站的程序统计访问用户数和百度统计…

Cobalt Strike 4.8 用户指南-第二节-用户界面

2.1、概述 Cobalt Strike用户界面分为两部分。界面顶部显示会话或目标的可视化。界面底部显示与你交互的每个 Cobalt Strike 功能或会话的选项卡。可以单击这两个部分之间的区域并根据自己的喜好调整它们的大小。 # 2.2、工具栏 顶部的工具栏提供对常见 Cobalt Strike功能的快…

车规级MCU「换道」竞赛

汽车芯片&#xff0c;尤其是MCU市场正在进入拐点期。 本周&#xff0c;总部位于荷兰的汽车芯片制造商—恩智浦&#xff08;NXP&#xff09;半导体总裁兼首席执行官Kurt Sievers在公司第二季度财报电话会议上告诉投资者&#xff0c;由于汽车需求停滞不前&#xff0c;该公司正在努…

一元四次方程求解-【附MATLAB代码】

目录 前言 求解方法 MATLAB验证 附&#xff1a;一元四次方程的故事 前言 最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一个问题&#xff0c;就是在求椭圆到原点的最短距离时&#xff0c;构建的方程是一个一元四次方程。无论是高中的初等数学…

pip出问题了,重装,获取python3.7 get-pip.py

下载脚本&#xff0c;对应版本 curl https://bootstrap.pypa.io/pip/3.7/get-pip.py -o get-pip.py https://bootstrap.pypa.io/pip/3.7/get-pip.py 安装 python get-pip.py windows下默认没有cur.exe 下载地址&#xff1a;通过百度网盘分享的文件&#xff1a;curl_windows…

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…

vue3 安装element-plus进行一些简单的测试

1、安装element-plus 官网地址&#xff1a;https://element-plus.org/zh-CN/guide/installation.html 2、安装方法&#xff1a; # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus 这里我选择…

嵌入式AI快速入门课程-K510篇 (第二篇 Ubuntu的基础操作)

第二篇 Ubuntu的基础操作 文章目录 第二篇 Ubuntu的基础操作1. 安装 VMware 运行 Ubuntu1.1 安装 VMware 1.2 使用VMware打开Ubuntu1.2.1 下载、解压Ubuntu映像文件1.2.1 在BIOS上启动虚拟化(virtualization)1.1.1 使用VMware运行Ubuntu 2.第1章 Ubuntu操作入门1.1 Ubuntu下打开…

Vmware虚拟机接入物理机路由器网络

网络适配器增加至两个&#xff0c;一个选NAT, 另一个选host-only,再加一个桥接&#xff0c;不勾选使用物理网卡&#xff0c;然后重启即可&#xff01;

数据结构--图(Graph)

定义 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成的一种非线性表结构&#xff0c;通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G表示一个图&#xff0c;V是图G中顶点的集合&#xff0c;E是图G中边的集合。 顶点&#xff08;…

three.js实现 加载3dtiles ,瓦片 ,倾斜摄影,功能

预览&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyexpand&idloadTiles 部署站点预览&#xff1a;http://threehub.cn/ 开源地址&#xff1a;https://z2586300277.github.io/three-cesium-examples/#/e…

mp3和mp4的区别是什么?怎么把mp3转成mp4?(全)

在生活中我们或多或少会听到“mp3”和“mp4”&#xff0c;那么什么是mp3和mp4呢&#xff1f;mp3和mp4的区别是什么&#xff1f;mp3是一种音频压缩技术&#xff0c;旨在在不显著牺牲音质的前提下减小音频文件的体积&#xff0c;使其适用于音乐和其他音频内容的存储与传输。相比之…

压测时,并发量过高时,响应时间出现尖刺

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++STL~~vector

文章目录 一、vector的概念二、vector的使用三、vector 迭代器失效问题四、vector的练习五、总结 一、vector的概念 vector是一个功能强大的模板类&#xff0c;用于表示动态数组。 动态大小调整&#xff1a; std::vector可以根据需要自动增长或收缩其存储的元素数量。这意味着…

tyut-数据库期末复习要点

第一章 数据库系统&#xff08;DBS&#xff09;是由数据库&#xff08;DB&#xff09;&#xff0c;数据库&#xff08;DBMS) &#xff0c;应用程序和数据库管理员 (DBA)组成的存储&#xff0c;管理&#xff0c;处理和维护数据的系统 数据模型&#xff1a;比较真实的模拟现实世…

如和写一个库,并发布,我的colorfontcolor产生使用

闲来无事&#xff0c;写了一个npm包 1.1.2版本以后可以使用&#xff0c;前面的版本都是bug colorfontcolor 具体使用具体实现出现的细节出现的问题 写包时出现的问题用的相关库问题 具体使用 npm i colorontcolor //es6环境,vue组件中使用 <template><div><h1 …

交通流量预测,模型优化

交通流量预测&#xff0c;时空预测 模型优化&#xff0c;网络搭建 时间序列预测、车辆轨迹预测 行人轨迹预测建模 深度学习模型为rnn,lstm,gru,s2s,transformer,diffusion等各大顶会sota方法 个人在做&#xff0c;可加急 保质保量&#xff0c;售后无忧