worker多线程的使用与理解

news2025/4/13 0:22:52

        JavaScript是单线程的,并不是说它是单线程语言,只能说在浏览器中运行是单线程的,单线程会免去许多麻烦,比如说,有两个线程同时进行DOM操作,一个是在父级下添加子元素,一个是删除这个父级元素,这样会冲突的。但是呢?浏览器是多线程的,浏览器打开多个标签页依旧运行良好,为了充分利用,就有了 Web Worker ,它为 JavaScript 创造多线程环境,允许主线程创建子线程,将一些任务分配给子线程运行。在主线程运行的同时,子线程在后台运行,两者互不干扰。等到子线程完成计算任务,再把结果返回给主线程。但这并不是说,JavaScript就不是单线程了,要知道,子线程是主线程控制的。

单线程证明

案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Worker多线程</title>
</head>
<body>
  <button  onclick="start()">开始</button>
  <button onclick="stop()">停止</button>
  <script type="text/javascript">
    function start(){
        let num = 0
        setInterval(() => {
        num++
        console.log(num)
    }, 500);
    }
    function stop(){
       alert('只要不点击暂停,这个alert任务就没有结束')
    }
  </script>
</body>
</html>

结果:

     每0.5秒在队列中添加一个任务,点击停止时,添加了一个alert任务,定时器这个不断添加的任务就得排队等待不再继续累加。


 Web Worker的使用

1.主线程创建worker。 

var worker = new Worker('work.js');

 2.主线程调用worker.postMessage()方法,向 Worker 发送内容,可以理解为参数。

worker.postMessage( 'a' );

worker.postMessage([1,2,3,4,5]);

worker.postMessage({

        name:'zhangsan',

        age:20

});

3.子线程通过message来监听主线程传递的信息 

this.addEventListener('message', function (e) {

    this.postMessage('e' + e.data); //传递过来的信息

  }, false);

//或者

onmessage = function(e){

    console.log('e',e.data); //传递过来的信息

}

4.主线程接收子线程返回的数据 

worker.onmessage = function(e){

         console.log('e',e)

 }

//或者

worker.addEventListener('message', function (e) {

        console.log('e',e.data)

 }, false);

5.关闭线程,节约资源

self.close()

worker.terminate()

(详情见下边案例)

<body>
  <button  onclick="start()">开始</button>
  <button onclick="stop()">停止</button>
  
  <script type="text/javascript">
    function start(){
       var worker = new Worker('worker.js');
       worker.postMessage(0);//将复杂计算交给子线程,可以理解为给参数让子线程去操作。
       worker.onmessage = function(e){
           console.log('主线程打印',e.data);//接收子线程返回来的数据,这个打印是主线程打印。   
       }
    }
    function stop(){
       alert('只要不点击暂停,这个任务就没有结束,定时器每0.5秒添加的任务需要排队等待。')
    }
  </script>
</body>

worker.js文件

// 响应主线程发过来的数据进行处理
onmessage = function(e){
    // console.log('e',e.data)
    var num = e.data;//接收从主线程传过来的值
    setInterval(() => {
        num++
        console.log(num)
        postMessage(num);//把计算结果传回给主线程
    }, 500); 
}

结果:

        主线程中走alert任务的时候,主线程打印已经停止,子线程继续再执行,不受影响。当alert任务点击确定结束,堆积的打印任务一口气都“吐”了出来。


关闭worker线程的方式

        1.worker线程(子线程)自己关闭:self.close();

        2.主线程控制关闭:worker.terminate();

案例:-----worker.terminate()

<body>
  <button onclick="start()">开始</button> 
  <script type="text/javascript">
    function start(){
       var worker = new Worker('worker.js');
       worker.postMessage(0);
       worker.onmessage = function(e){
           if(e.data == 5){
                worker.terminate();	
                console.log('主线程打印:worker线程结束')
           }
       }
    }
  </script>
</body>

结果:

案例: -----self.close() 

worker.js

onmessage = function(e){
    var num = e.data;//接收从主线程传过来的值
    setInterval(() => {
        num++
        console.log(num)
        if(num == 5){
            self.close() 
        }
        postMessage(num);//把计算结果传回给主线程
    }, 500);
}

 

               结束。 

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

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

相关文章

Pandas数据清洗函数大全

文章目录 一、drop()&#xff1a;删除指定行列 1. 删除指定行2. 删除指定列 二、del()&#xff1a;删除指定列三、isnull()&#xff1a;判断是否为缺失 1. 判断是否为缺失2. 判断哪些列存在缺失3. 统计缺失个数 四、notnull()&#xff1a;判断是否不为缺失五、dropna()&#x…

Java笔记024-Math类、Arrays类、System类、BigInteger和BigDecimal类、日期类

常用类Math类基本介绍Math类包含用于执行基本数学运算的方法&#xff0c;如初等指数、对数、平方根和三角函数方法一览(均为静态方法)Math常见方法应用案例1、 abs绝对值2、pow求幂3、ceil向上取整4、floor 向下取整5、round 四舍五入6、sqrt 求开方7、random求随机数//思考&am…

Webpack常见的插件和模式

1、认识Plugin Webpack的另一个核心是Plugin&#xff0c;官方有这样一段对Plugin的描述&#xff1a; While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks like bundle optimization, asset manageme…

《对线面试官》| 高频计算机网络面试题 pt.2

目录11、Get与POST的区别12、Session、Cookie 的区别13、简单聊聊 HTTP 协议吧14、URI 和 URL 的区别15、GET 和 POST 方法都是安全和幂等的吗&#xff1f;16、说说 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f;17、那上面的 HTTP/1.1 的性能瓶颈&#xff0c;HTTP/2 做了…

中国蚁剑的工作原理

中国蚁剑连接http://192.168.11.157/dvwa/hackable/uploads/pass.php蚁剑连接并同时用wireshark抓取流量1274 行&#xff0c;追踪tcp流因为我们的php.php内容是 $_POST[pass]&#xff0c;所以这里是post了一个pass参数&#xff0c;后面跟上了命令。通过站长工具-URL解码/编码 (…

15.Isaac教程--Isaac机器人引擎简介

Isaac机器人引擎简介 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录Isaac机器人引擎简介基础Codelets完整的应用基础 本节介绍如何使用 Isaac 机器人引擎。 它介绍了相关术语并解释了 Isaac 应用程序的结构。 Isaac 应用程序由 JavaS…

卫星AIS接收机

1.设备简介星载AIS模块&#xff0c;专门针对小卫星设计的AIS载荷&#xff0c;设计时考虑到CubeSat的尺寸、重量和功率限制&#xff0c;也可以作为较大的LEO卫星上的有效载荷。2.产品特征独立4信道AIS接收机集成LNA和SAW滤波器AIS帧的数据存储支持频谱样本采集安全在轨软件升级支…

【Wiki】XWiki安装教程_War包版本

目录0、XWiki说明1、war包安装说明1.1、环境说明1.2、如果懒得下载可以使用这边准备好的物料包汇总2、war包安装2.1、Tomcat安装2.2、java安装(需要root权限)2.3 、使用 source /etc/profile 刷新linux配置2.4、数据库安装2.5、解压war包与xip2.6、修改配置文件2.6.1、修改WEB-…

mysql快速生成100W条测试数据(4)全球各城市房价和销售数据并存入mysql数据库

首先这个就是我们需要生成的数据类型&#xff0c;这种只是我们用于测试以及学习时候使用&#xff0c;主要就是全球城市房价的均值和一些虚拟的销售数据 这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测…

Speckle Revit连接器使用教程

Speckle Revit 连接器目前支持 Autodesk Revit 2020、2021、2022 和 &#x1f195;2023。 1、安装Speckle revit连接器 要安装 Revit 连接器并添加 Speckle 帐户&#xff0c;请按照 Speckle 管理器中的说明进行操作。 安装后&#xff0c;可以在Speckle选项卡下的功能区菜单中…

一个前端大神电脑里的秘密

前言作为前端仔&#xff0c;当你入职一家公司&#xff0c;拿到新发的电脑&#xff0c;你会对电脑干点啥&#xff0c;装开发环境&#xff1f;装软件&#xff1f;你是否铺天盖地到处找之前电脑备份的东西&#xff1f;又或者是想不起来有什么上一台电脑好用的软件叫什么名&#xf…

KT148A语音芯片420s秒的语音空间是什么意思,mp3文件支持多大

一、问题简介 我想问一下KT148A这个芯片真的能存420秒的语音么&#xff1f;我随便一个5秒的语音mp3格式都65k了&#xff0c;如果是这样的话 那我的mp3的源文件在最小的采样率和最小码率的情况下 mp3文件可以支持多大&#xff1f;有没有实际测试的数据&#xff0c;使用的是一线串…

【可解释性机器学习】可解释机器学习简介与特征选择方法

特征选择&#xff1a;Feature Importance、Permutation Importance、SHAP1. Introduction什么是可解释机器学习&#xff08;Explainable ML&#xff09;&#xff1f;为什么需要Explainable ML?直接使用一些可以interpretable的模型不好吗&#xff1f;2. Local Explanation方法…

Homekit智能家居DIY-智能吸顶灯

灯要看什么因素 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#xff09;单位面积&#xff0c;简单理解的话就是越靠近灯光&#xff0c;看的就越清楚&#xff0c;是个常识性问题。 不同房间户型对照度的要求自然不尽相同&#xff0c;…

http协议之Range

http协议中可能会遇到&#xff1a;请求取消或数据传输中断&#xff0c;这时客户端已经收到了部分数据&#xff0c;后面再请求时最好能请求剩余部分&#xff08;断点续传&#xff09;&#xff1b;或者&#xff0c;对于某个较大的文件&#xff0c;能够支持客户端多线程分片下载..…

某集团汽车配件电子图册性能分析案例(三)

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映&#xff0c;汽车配件电子图册调用图纸时&#xff0c;出现访问慢现象。 汽车集团总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图册…

web服务器、中间件和他们的漏洞

目录 Nginx Apache Tomcat IIS 漏洞 Apache解析漏洞 文件名解析漏洞 罕见后缀 .htaccess文件 Ngnix解析漏洞 畸形解析漏洞(test.jpg/*.php) %00空字节代码解析漏洞 CVE-2013-4547(%20%00) IIS解析漏洞 目录解析漏洞(/test.asp/1.jpg) 文件名解析漏洞(test.asp;…

想转行没方向,PMP证书用处大吗?

当下了要转行的决心&#xff0c;你又陷入另一种焦虑中——怎么转&#xff1f;毕竟“隔行如隔山”。要知道缺乏经验&#xff0c;你要面对的是旷日持久的努力、未知的付出和回报转换率。 但别忘了&#xff0c;在山与山之间&#xff0c;有一些纵横交错的道路相连&#xff0c;可以…

详解SpringMVC

1.DispatcherServlet初始化时机 DispatcherServlet是由spring创建的&#xff0c;初始化是由Tomcat完成的&#xff0c;通过setLoadOnStartup来决定是否为tomcat启动时初始化 Configuration ComponentScan // 没有设置扫描包的话默认扫描当前配置的包及其子包 PropertySource(&…

verilog学习笔记- 11)按键控制蜂鸣器实验

简介&#xff1a; 蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器&#xff0c;其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源&#xff0c;只要通电就会发声。而无源蜂鸣器由于不含内部震荡源&#xff0c;需要外接震荡信号才能发声。 左边为有源…