JavaScript如何解决单线程缺陷——webWorker
解决JavaScript单线程问题——webWorkers
MDN的介绍为:
Web Worker 为 Web 内容在后台线程中运行脚本提供了一种简单的方法。线程可以执行任务而不干扰用户界面。此外,它们可以使用
XMLHttpRequest(尽管responseXML和channel属性总是为空)或fetch(没有这些限制)执行 I/O。一旦创建,一个 worker 可以将消息发送到创建它的 JavaScript 代码,通过将消息发布到该代码指定的事件处理器(反之亦然)。
简单来说就是, 我们可以通过使用worker为主线程分担数据处理压力.
假如说你有一段很大的数据需要处理, 而你又不想这段程序阻碍你的其他操作,这时候就可以考虑一下webWorker.
如何使用webWorker
创建worker
先创建一个worker.js文件, 该文件为线程代码文件, 文件中的代码会在后台线程中运行.
在主线程中创建一个worker, 通过类似通讯的方式在主线程和worker中进行数据传递.
// index.js主线程代码块
// 简单创建一个worker名为myworker
let myworker = new Worker("./firstworker.js") // 参数为firstworker.js文件的路径
主线程和worker之间进行通讯
主线程发送数据给worker: 在主线程中通过
worker.prototype.postMessage()进行通信// index.js主线程代码块
// ... 创建完worker console.log("主线程我说句话先,接下来你要替我干活了.");
// 简单向worker中发送一个数组[1, 2, 3]
myworker.postMessage([1, 2, 3]);
worker接收来自主线程的数据: 在myworker.js中接收数据
// firstworker.js代码块
// 接收来自主线程的数据,数组[1, 2, 3]
onmessage = function recive(msg) {
// 接收到的是一个MessageEvent对象, 我们可以获取data属性
console.log(msg.data); // 输出[1, 2, 3]
};
我们也可以使用更简洁的方式
// firstworker.js代码块
// 使用解构和匿名箭头函数
onmessage = ({ data }) => {
console.log(data); // 输出[1, 2, 3]
};
worker发送数据给主线程: 通过
postMessage()发送数据给主线程index.js接收到数组[1, 2, 3]之后, 我们可以简单的对数组进行一个逆序操作, 再把结果返回主线程
// firstworker.js代码块
onmessage = ({ data }) => {
// 主线程发来的数据
console.log("主线程发来的数据:", data);
// 赋值一个新变量newdata
let newdata = data;
// 对新变量操作(数组逆序)
newdata.sort((a, b) => {
return b - a;
});
console.log("worker后台线程处理完成的数据newdata:", newdata);
// 处理完的结果递交给主线程
postMessage(newdata);
};
主线程接收worker讯息: 通过
addEventListener()对worker的动作进行监听// index.js主线程代码块
// 主线程通过 监听 实例的message事件获取worker的数据
// 接收myworker处理之后的结果
myworker.addEventListener("message", ({ data }) => {
console.log("接收到来自worker处理完的数据:", data);
});
关闭线程
worker.terminate()可以帮助我们在主线程中随意关闭线程, 即为从主线程中立刻终止一个运行中的 worker
// index.js主线程代码块
// 3s后关闭线程
setTimeout(() => {
console.log("关闭myworker,你别说话了")
myWorker.terminate();
}, 3000);
// firstworker.js代码块
setTimeout(() => {
console.log("4秒时让我说句话")
}, 4000);
worker监听
主线程通过 addEventListener() 对worker动作进行监听, 动作包含三种
- message
- error
- messageError:
注意事项
- worker是HTML5规范的API,所以你没法在node环境中使用.
- worker没办法对dom元素操作, 只能在主线程中, 多线程操作dom感觉就不大好.
- worker可以用于执行长时间运行的计算、处理大量数据、执行网络请求等任务,而不会影响用户界面的响应性能.帮助开发人员提高Web应用程序的性能和响应性能.
- 本文章只对worker的使用进行了简单介绍, 具体进阶用法等详细内容还得参考MDN文档(共享worker, 线程安全, 嵌入式worker等)
JavaScript如何解决单线程缺陷——webWorker的更多相关文章
- JavaScript之JS单线程|事件循环|事件队列|执行栈
本博文基于知乎"JavaScript作用域问题?"一问,而引起了对JavaScript事件循环和单线程等概念与实践上的研究.深入理解. 一.概念 0.关键词:JavaScript单 ...
- Javascript引擎的单线程机制和setTimeout执行原理阐述
工作中使用setTimeout解决了一个问题,于是对setTimeout的相关资料整理了下,以及对js引擎执行的原理一并整理了下,希望能给码农们一些帮助.若发现有错的地方大家及时指出,共同学习进步. ...
- JavaScript到底是不是单线程
JavaScript到底是不是单线程 JavaScript引擎 在了解计时器内部运作前,我们必须清楚一点,触发和执行并不是同一概念,计时器的回调函数一定会在指定delay的时间后被触发,但并不一定立即 ...
- Javascript定时器(一)——单线程
一.JavaScript 引擎是单线程的 可以从下面的代码中看到,第一个用setTimeout中的代码是死循环,由于是单线程,下面的两个定时器就没机会执行了. <script type=&quo ...
- JavaScript 闭包解决计数器问题
JavaScript 闭包解决计数器问题 var add = (function () { var counter = 0; return function () {return counter += ...
- JavaScript引擎是单线程的
从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下下面三个函数是如何控制计时 ...
- Javascript:必须知道的Javascript知识点之“单线程事件驱动”
heiboard: Javascript:必须知道的Javascript知识点之“单线程事件驱动”
- 编程原理—如何用javascript代码解决一些问题
关于编程,我最喜欢的就是解决问题.我不相信有谁天生具有解决问题的能力.这是一种通过反复锻炼而建立并维持的能力.像任何练习一样,有一套指导方针可以帮助你更有效地提高解决问题的能力.我将介绍5个最重要的软 ...
- JavaScript异步和单线程
一,同步和异步的区别: 同步会阻塞代码执行,而异步不会.(比如alert是同步,setTimeout是异步) 二,前端使用异步的场景: 1,定时任务:setTimeout,setInterval 2, ...
- 常见JS(JavaScript)冲突解决方法
1.一般JS冲突解决办法 a.最容易出现的就是js的命名冲突 ①.变量名冲突 变量有全局变量和局部变量当全局变量变量和局部变量名称一致时,就会js冲突,由于变量传递数值或地址不同就会产生JavaScr ...
随机推荐
- MySQL长时间不登录密码过期解决办法
MySql管理工具 Navicat for MySql的时候,弹出了一个1862 - MySql Your password has expired.To log in you must change ...
- Rancher 系列文章-RHEL7.8 离线有代理条件下安装单节点 Rancher
一 基础信息 1.1 前提 本次安装的为 20220129 最新版:Rancher v2.6.3 VM 版本为 RHEL 7.8, 7.9 或 8.2, 8.3, 8.4(Rancher 官网要求) ...
- flask-login使用方法
烧瓶登录 Flask-Login 为 Flask 提供用户会话管理.它处理登录.注销和长时间记住用户会话的常见任务. 它会: 将活动用户的 ID 存储在Flask Session中,让您轻松登录和注销 ...
- [Linux/CENTOS]YUM提示: Another app is currently holding the yum lock; waiting for it to exit...
1 问题描述 使用yum安装Nginx的安装依赖组件: yum -y install gcc gcc-c++ automake autoconf libtool make 但是,在执行过程中出现如下信 ...
- SpringCloud源码学习笔记3——Nacos服务注册源码分析
系列文章目录和关于我 一丶基本概念&Nacos架构 1.为什么需要注册中心 实现服务治理.服务动态扩容,以及调用时能有负载均衡的效果. 如果我们将服务提供方的ip地址配置在服务消费方的配置文件 ...
- 基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合
SqlSugar的开发框架本身主要是基于常规关系型数据库设计的框架,支持多种数据库类型的接入,如SqlServer.MySQL.Oracle.PostgreSQL.SQLite等数据库,非关系型数据库 ...
- AutoGPT目前只是成功学大师GPT版
一大波韭菜被收割了 最近很多人在交流对于AutoGPT的震惊和激动.AutoGPT是一个开源的应用程序,展示了GPT-4语言模型的能力.这个程序由GPT-4驱动,自主地开发和管理业务,以增加净值.它是 ...
- flutter系列之:如何自定义动画路由
目录 简介 自定义跳转使用 flutter动画基础 实现一个自定义的route 总结 简介 flutter中有默认的Route组件,叫做MaterialPageRoute,一般情况下我们在flutte ...
- Node.js入门学习笔记
NodeJs是js的运行时,意味着可以在浏览器外运行js.可以使用nodejs来构建服务器端应用.CLI应用.Web API,甚至用electron构建桌面端应用. 使用nvm来管理node版本. 在 ...
- mysql安装my.cnf配置
进入my.cnf文件//乱码修改 设置编码 character_set_server = utf8mb4 //编码 collation-server = utf8mb4_general_ci //连接 ...