前端webWorker 的介绍以及应用

文章目录

  • webWorker
    • 以下是关于 Web Workers 的一些关键概念:
    • 控制台查看
    • 使用注意事项
    • 消息传递
    • 创建subworker
    • webWorker的具体使用
  • 共享worker(SharedWorker)
    • 创建方法:
    • 与专用worker的主要区别:

webWorker

JavaScript是单线程的语言,如果在浏览器中需要执行一些大数据量的计算,页面上的其他操作就会因为来不及响应而出现卡顿的情况,因为这时js还在帮你完成上一个指令呢!这对用户体验来说是极其糟糕的。拿BIM数据的轻量化展示来说,在浏览器端展示大体量的模型,需要从约定的标准模型数据格式中先请求回来各种数据,然后解析计算各种顶点、颜色、属性数据等,在这段过程中前端页面就需要等待一段时间。

webWorker 使用场景:Web Worker 在处理一些耗时的计算、大量数据的处理和其他计算密集型任务方面表现出色,可以提高整体的性能和用户体验。但要注意,它们并不适用于所有的场景,特别是涉及到直接操作 DOM 的情况。

以下是关于 Web Workers 的一些关键概念:

  • 线程模型: 在传统的浏览器中,JavaScript 是在主线程中运行的,而主线程主要负责处理用户界面和与用户交互的任务。使用 Web Workers 可以创建额外的线程,这些线程在后台运行,独立于主线程。
  • 独立的全局上下文: 每个 Web Worker 都有自己独立的全局上下文,与主线程中的全局上下文是分离的。这意味着在 Web Worker 中定义的变量和函数不会影响主线程中的环境,反之亦然。
  • 通信: 主线程和 Web Worker 之间通过消息进行通信。可以使用 postMessage 方法发送消息,并在两者之间建立双向通信。消息传递是通过拷贝而不是共享对象来完成的,确保数据的安全性。
  • 不能访问 DOM: Web Workers 不能直接访问 DOM,这意味着不能直接操作页面上的元素。它们主要用于处理计算密集型的任务,而不是用户界面的交互。
  • 网络请求: Web Workers 可以执行异步操作,包括发起网络请求。它们可以执行一些与网络相关的任务而不会阻塞主线程。
  • 生命周期: Web Workers 有自己的生命周期,可以通过事件监听器(如 onmessage 和 onerror)来捕获相关事件。当不再需要一个 Web Worker 时,可以通过调用 terminate 方法来终止它。
  • 限制: 由于 Web Workers 在独立的线程中运行,因此它们不能直接访问主线程的变量和函数。通信是通过消息传递实现的,这也导致了一些数据的复制开销。

控制台查看

在这里插入图片描述

使用注意事项

  • 同源限制:worker脚本与主进程的脚本必须遵守同源限制。他们所在的路径协议、域名、端口号三者需要相同

  • 接口限制:window作用域下的部分方法不可使用,如DOM对象、window.alert和window.confirm等方法。可使用参考 Supported Web APIs

  • 文件限制:无法加载本地js文件,必须使用线上。

  • 记得关闭:worker会占用一定的系统资源,在相关的功能执行完之后,一定要记得关闭worker。
    父进程中使用:worker.terminate(); 关闭;
    在worker进程内部关闭 self.close();

消息传递

主进程和worker之间通过发送消息的机制进行通信。对于主进程和worker自身:

  • 都使用postMessage发送消息
  • 都使用onmessage接收消息
  • 都使用onerror监听错误事件

在主进程中onmessage、onerror和postMessage 必须挂在worker对象上。在worker中使用时
self.onmessage \self.postMessage\ self.onerror就行,或者不写self,因为在worker内部,self指向worker自己

创建subworker

在一个worker中创建多个子worker分别处理不同的内容
注意:子worker与父worker同样需要遵守同源限制。
在这里插入图片描述

webWorker的具体使用

在这里插入图片描述

页面

<script lang="ts" setup>
import BackButton from '/@/components/BackButton/index.vue';
import { onMounted, reactive, watch } from 'vue';const props = defineProps({value: {type: String,default: '',},
});
onMounted(() => {});var worker = new Worker('worker.js');
// 向 Worker 发送消息
worker.postMessage(100); // 传递数据,例如计算斐波那契数列的第 30 项
// 监听从 Worker 返回的消息
worker.onmessage = function (event) {var result = event.data;console.log('Worker 返回的结果1:', result);// 关闭 Workerworker.terminate();
};// 监听 Worker 的错误信息
worker.onerror = function (error) {console.error('Worker 发生错误:', error);
};/*** 开多个线程*/
var worker2 = new Worker('worker2.js');
worker2.postMessage(10); // 传递数据,例如计算斐波那契数列的第 30 项
// 监听从 Worker 返回的消息
worker2.onmessage = function (event) {var result = event.data;console.log('Worker 返回的结果2:', result);// 关闭 Workerworker.terminate();
};// 监听 Worker 的错误信息
worker2.onerror = function (error) {console.error('Worker 发生错误:', error);
};
</script>
<template><br /><div class="m-10"><div class="flex-start"><BackButton /></div><h1>test webworker</h1></div>
</template>
<style lang="less" scoped></style>

worker.js

self.onmessage = function (event) {console.log(event);let data = event.data// 计算处理大数据量的逻辑let result = fn(data)// 将结果发送回主线程self.postMessage(result)
}// 大数据量的逻辑
function fn(n) {let result = 0for (let i = 0; i <= n; i++) {result += i}return result
}

共享worker(SharedWorker)

上面创建worker的方式在MDN中被归类为专用worker的用法。另一类worker是共享worker,其实际用途与专用worker差异并不大,对于一些公用的方法可以放在共享Worker中供不用的场景使用。SharedWorker可以:

  • 在不同的html页面之间使用共享worker;
  • 在主窗口和iframe之间使用共享worker;
  • 不同的worker同时访问共享worker中定义的数据或方法;

创建方法:

// 在同源的两个页面中都创建SharedWorker,使用同一个脚本
var myWorker = new SharedWorker("xxx.js");

与专用worker的主要区别:

在共享worker的使用环境下,主进程和worker的监听和发送消息都要在port端口下进行

myWorker.port.postMessage([first.value, second.value]);

共享worker端口启动后时,两个页面的主进程都会向 worker 发送消息。在worker中使用事件监听需要放在onconnect事件中进行

onconnect = function(e) {var port = e.ports[0];port.onmessage = function(e) {var workerResult = 'Result: ' + (e.data[0] * e.data[1]);port.postMessage(workerResult);}port.start();
}

如果使用 addEventListener 方式监听 worker消息事件,需要在主进程中使用myWorker.port.start()方法主动启动端口,使用onmessage监听则不用调用启动的方法。

myWorker.port.addEventListener('message', function(e) {// xxxconsole.log('Message received from worker');
});
myWorker.port.start();

在onconnect中使用port.onmessage和port.postmessage进行监听和发送
主进程中使用 port.postMessage()和 port.onmessage 处理从 worker 返回的消息

更多详情参考这位博主的

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OneFlow深度学习框架介绍:新手快速上手指南

深度学习已成为现代人工智能领域的核心技术&#xff0c;而选择一款合适的深度学习框架对于科研人员与开发者而言至关重要。OneFlow作为近年来崭露头角的一款高性能深度学习框架&#xff0c;以其独特的设计理念、卓越的性能表现和友好的社区生态吸引了大量关注。本篇博客将以新手…

朗致集团面试-Java架构师

总结 三轮面试&#xff0c;第一轮是逻辑测试性格测试&#xff0c;第二轮是技术面试&#xff08;面试官-刘老师&#xff09;&#xff0c;第三轮是CTO面试&#xff08;面试官-屠老师&#xff09;。如果第三轮面试通过&#xff0c;考官会问你薪资意向&#xff0c;如果满意的话HR就…

Java基础习题及参考代码(循环结构)

二白整理了一些关于循环结构的习题&#xff0c;本人也逐个完成&#xff0c;有需要的同学自取&#xff0c;答案仅供参考。 01&#xff1a;求10以内的偶数的和。 package practise;public class Demo01 {public static void main(String[] args) {// 01&#xff1a;求10以内…

Nginx转发请求错误

说明&#xff1a;记录一次使用Nginx转发请求的错误&#xff1b; 场景 公司内部有两台服务器都跑了后端项目&#xff0c;在使用Nginx做请求分发时&#xff0c;我发现其中有台服务器一直没有处理请求&#xff08;没打印相关的日志信息&#xff09;&#xff0c;于是我修改了下Ng…

在Windows下面的vscode配置cmake使用vcpkg包管理器

安装 vscode下载地址 cmake下载地址 vcpkg下载地址 创建CMake项目 // main.cpp #include <fmt/core.h>int main() {fmt::print("Hello World!\n");return 0; }// CMakeLists.txtcmake_minimum_required(VERSION 3.10)project(HelloWorld)find_package(fmt…

连锁收银系统哪个好用 国内三大连锁收银系统评比

随着数字化管理趋势下互联网技术的不断发展革新&#xff0c;互联网技术&#xff0c;以及不断升级优化传统行业渠道模式&#xff0c;线上线下结合的电子商务模式正逐渐成为企业发展的趋势。而门店管理系统也在越来越多的企业应用。但市场上连锁店管理系统品牌诸多&#xff0c;很…

FPGA开发之状态机设计

状态机是许多数字系统的核心部件&#xff0c;是一类重要的时序逻辑电路。通常包括三个部分&#xff1a; 一是下一个状态的逻辑电路&#xff0c; 二是存储状态机当前状态的时序逻辑电路&#xff0c; 三是输出组合逻辑电路。 通常&#xff0c;状态机的状态数量有限&#xff0c;称…

【AI基本模型】简化生成对抗网络 (GAN)

目录 一、说明 二、GAN的工作 三、如何手动计算生成对抗网络&#xff08;GAN&#xff09;&#xff1f;✍️ 四、GAN的应用 一、说明 生成对抗网络 &#xff08;GAN&#xff09; 是一种机器学习算法&#xff0c;可以生成与现实世界数据几乎无法区分的合成数据。它们的工作原理是…

部署Kafka集群图文详细步骤

1 集群规划 共三台虚拟机同处overlay网段&#xff0c;每台虚拟机部署一套kafka和zookeeper&#xff0c;kafka_manager安装其中一台虚拟机上即可。 HostnameIP addrPortListenerzk1docker-swarm分配2183:2181zk2docker-swarm分配2184:2181zk3docker-swarm分配2185:2181k1docke…

十款人力资源管理软件盘点:中小企业的智慧抉择

本文为您详细介绍十款备受推崇的人力资源管理系统有&#xff1a;Zoho People、简道云HRM、Waypoint HR、SAP SuccessFactors、Namely、肯耐珂萨、BambooHR、Gusto、Oracle HCM Cloud、北森eHR&#xff0c;帮助您选择最适合您企业需求的解决方案。 一、Zoho People Zoho Peopl…

Flutter第九弹 构建列表元素间距

目标&#xff1a; 1&#xff09;Flutter Widget组件之间间距怎么表示&#xff1f; 2&#xff09;列表怎么定义子项之间间距&#xff1f; 一、间距的表示组件 列表组件的间距一般采用固定间距&#xff0c;间距占据可见的空间。 已经使用的表示间距的组件 Spacer&#xff1a…

day05-Elasticsearch01

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch 是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在 GitHub 搜索代码在电商网站搜索商品在百度搜索答案在打…