Web Worker

article/2025/10/5 4:35:22

Web Worker

  • Web Worker?
  • Web Worker 基本使用
    • 主线程
    • Worker线程
  • Web Worker的优势在哪?

Web Worker?

我们都知道JavaScript是单线程的,至于为什么是单线程的,以下内容来源阮一峰前辈的文章

作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

但这样的话,并不是很高效,因为单线程无法充分发挥计算机的计算能力。所以
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。

在使用Web Worker前需要注意

  • Worker 的全局对象是WorkerGlobalScope,与主线程不一样,,所以其无法读取主线程所在网页的 DOM 对象,也无法使用document、window、parent这些对象。但是,Worker 线程可以使用navigator对象和location对象。
  • Worker 线程不能执行alert()方法和confirm()方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。

Web Worker 基本使用

主线程

创建线程

// 创建线程,work.js为线程的脚本文件
var worker1 = new Worker('worker1.js');

在这里插入图片描述
基本操作

// 发送消息
worker1.postMessage('Hello World');// 接收消息
worker1.onmessage=e=>{console.log(e.data);
}// 关闭线程
worker1.terminate();

Worker线程

self代表子线程自身,即子线程的全局对象。

// 接收消息 and 发送消息
//(1)
self.addEventListener('message', function (e) {self.postMessage(e.data);
});
//(2)
addEventListener('message', function (e) {postMessage( e.data);
});// 关闭
//(1)
self.close()
//(2)
close();

Web Worker的优势在哪?

我们通过一个例子来说明多线程的优势

在没有线程的情况下,主线程运行三个斐波那契函数所需事件如下

<!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>Document</title>
</head>
<body><script>function fb(n){     if(n==1||n==2){return 1;}return fb(n-1)+fb(n-2)}console.time('三个fb执行时间');var result=fb(40)var result=fb(40)var result=fb(40) console.timeEnd('三个fb执行时间')</script>
</body>
</html>

在这里插入图片描述

现在我们创建三个进程,每一个进程运行一个函数

主线程代码

 var worker1=new Worker('worker1.js');var worker2=new Worker('worker2.js');var worker3=new Worker('worker3.js');worker1.onmessage=e=>{console.log(e.data);}worker2.onmessage=e=>{console.log(e.data);}worker3.onmessage=e=>{console.log(e.data);}

另外三个线程代码如下

function fb(n){if(n==1||n==2){return 1;}return fb(n-1)+fb(n-2)
}
console.time('fb执行时间1');
var result=fb(40)
console.timeEnd('fb执行时间1')
self.postMessage('worker1');
function fb(n){if(n==1||n==2){return 1;}return fb(n-1)+fb(n-2)
}
console.time('fb执行时间2');
var result=fb(40)
console.timeEnd('fb执行时间2')
self.postMessage('worker2');
function fb(n){if(n==1||n==2){return 1;}return fb(n-1)+fb(n-2)
}
console.time('fb执行时间3');
var result=fb(40)
console.timeEnd('fb执行时间3')
self.postMessage('worker3');

在这里插入图片描述
从这个例子我们可以看出,如果我们没有线程,主线程执行三个函数需要9.669s的时间。而当我们创建三个线程,一个线程执行一个函数时,主线程得到结果的最长时间为2.217s

所以在实际中,我们一般使用Worker线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务可以交由 Worker 线程执行,主线程(通常负责 UI 交互)能够保持流畅,不会被阻塞或拖慢。


http://chatgpt.dhexx.cn/article/G3Y5h0LS.shtml

相关文章

werw er

TOCerwr wer wer wer 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能…

whisper

Robust Speech Recognition via Large-Scale Weak Supervision 介绍 大规模弱监督的训练。先前的方法都是通过大量的无监督学习训练&#xff08;无监督的数据容易收集&#xff0c;所以通过大量无监督的学习可以训练出一个质量较好的encoder&#xff09;。但是用的时候还需要找…

2015WPE封包刷Q币图文教程

首先进入魔域小组官网 www.myxzg.pw 然后观看免费的视频教程 土豆网观看地址:http://www.tudou.com/listplay/2tXberN2LlM/-6FhCm1CMv0.html

WPE详细教程一

这里讲的WPEPRO的使用方法 一、打开WPE&#xff0c;选择进程client.exe&#xff0c;切换到游戏打一段话(如9个1)&#xff0c;然后切出去按开始截取&#xff0c;切换到游戏反复粘贴刚才那复制好的9个1。 然后切出游戏按停止,就会出来一堆数字.其中找S包最简单的方法就是找位数相…

WPE详细教程

这里讲的WPEPRO的使用方法 一、打开WPE&#xff0c;选择进程client.exe&#xff0c;切换到游戏打一段话(如9个1)&#xff0c;然后切出去按开始截取&#xff0c;切换到游戏反复粘贴刚才那复制好的9个1。 然后切出游戏按停止,就会出来一堆数字.其中找S包最简单的方法就是找位数相…

Wpe工作原理和教程-以传奇为列

wpe所要改的&#xff0c;不是[游戏里面的数值]&#xff0c;而是[伪造信息封包]。 什么意思咧??就是我们用wpe所要改的&#xff0c;并不是"生命力由100变成10000"之类的东西&#xff0c; 这种东西无法用wpe改&#xff0c; 我们要改的可能是把"我卖了一个500元的…

WPE详细教程二

本教程的内容安排 本教程的安排如下:首先是讲为什么会有封包,封包的结构是怎样的。  然后介绍TCP/IP技术的相关内容,定位封包在网络传输中的层!  然后介绍WPE的工作界面,以及各功能按扭的作用!  前面的内容属于了解阶段的内容,帮助您了解相关内容,对下面的学习会…

WPE 过滤器 滤镜 用法

过滤所有数值匹配的数据包&#xff0c;并修改指定的bit位 打开游戏 打开WPE 附加游戏进程 选项配置 用来配置抓取发送和接收包类型 先抓取发送包&#xff0c;也就是游戏中主动发给服务器的包 点击开始抓包 输入喊话内容 分别输入1和2进行抓包 结束抓包 显示…

WPE详细教程三

关于滤镜 经过前面的讲解,大家该知道封包制作外挂的原理了,这里再深入讲解一点,作为封包,按道理只能修改封包,达到修改游戏的目的,其实,如果我们能更广泛地想一想,如果我们能分析封包,其实是可以制作出很强大的功能的,当然,如果让WPE分析封包,能达到的功能是有限的…

封包(一)(雷电模拟器+ProxyDroid+查尔斯3.93+WPE)

自从换了工作就没有给大家分享一些干活&#xff0c;在加上陪伴自己的孩子没有时间更新文章了&#xff0c;这只能在晚上给大家写文档了&#xff0c;我最近在游戏公司上班&#xff0c;研究封包。我把这些东西都做成了笔记&#xff0c;我想有些东西是大家都想弄明白的&#xff0c;…

python 封包发包_python中封包建立过程实例

在python的变量使用中&#xff0c;有时候会赋予多个值一起使用&#xff0c;相信很多人一般都是添加一个值&#xff0c;对于这种多个赋值还没有接触过&#xff0c;其实这是python高级里的封包使用&#xff0c;我们在下面会进行简单的介绍&#xff0c;并解释建立封包的具体方法和…

安卓模拟器封包抓取加解密

什么是封包呢&#xff1f; 在网上也许能找到许许多多的答案&#xff0c;电脑端的比较多。但是好多都是比较旧的。这方面的知识相当的缺少。 封包就是数据&#xff0c;游戏向服务端发送的请求。就比如你游戏一顿操作&#xff0c;结束最后就是一条数据发给服务器。 封包常见的就有…

海盗王封WPE的方法

在游戏中&#xff0c;合当地使用WPE可以减轻玩家的重复操作&#xff0c;但是利用WPE刷bug作弊&#xff0c;会影响游戏平衡&#xff0c;故意大量发包还会导致全服集体卡顿。因此&#xff0c;很多开服的GM对此深恶痛绝。 以海盗王游戏为例&#xff0c;怎么封WPE呢&#xff1f; 首…

WPE封包外挂教程(上)

国家新闻出版署和信息产业部严厉打击私服和外挂&#xff0c;本教程转载于此处仅做学习和研究之用,如若因此导致任何后果,本站概不负责&#xff01;Wpe工作原理和可行性分析 wpe所要改的&#xff0c;不是[游戏里面的数值]&#xff0c;而是[伪造信息封包]。 什么意思咧??就是我…

wpe封包修改服务器数据,WPE修改基础第三课:封包的基本知识

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。 您需要 登录 才可以下载或查看,没有帐号?立即注册 x WPE修改基础第三课:封包的基本知识 前面给同学们介绍了WPE的作用,和WPE加载游戏的进程,接下来我们就要去游戏中截取封包了,但是大家对封包还是有个模糊的认…

wpe修改充值_WPE修改基础第四课:封包分析教程

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。 您需要 登录 才可以下载或查看,没有帐号?立即注册 x WPE修改基础第四课:封包分析教程 很多刚学习WPE的新人,最喜欢做的事就是拿一个封包,发给我,然后问,静姐,这个封包的代码是什么意思? 在这里我要和大家说…

讲解wpe抓包,封包

相信大多数朋友都是会使用WPE的&#xff0c;因为这里也有不少好的教程&#xff0c;大家都辛苦了&#xff01; 先说说接触WPE的情况。当时好像是2011年&#xff0c;我本来不知道WPE对游戏竟有如此大的辅助作用的。起先找WPE软件的时候&#xff0c;只是因为我找网络抓包工具&…

Centos7笔记之KVM之磁盘格式转换

一、目标 centos7.6环境下&#xff0c;kvm的raw和qcow2磁盘间的格式转换 二、平台 [rootxserver ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 三、解析 1.每个kvm虚拟机都有个配置文件存放在/etc/libvirt/qemu/ 2.使用纯GUI界面创建的kvm虚拟机的默…

计算机格式怎么调,怎么改电脑硬盘格式?

电脑硬盘格式很容易修改,但是要注意,一般来说我们通过系统自带的格式化来修改硬盘格式,但是我们也有CMD命令来无损转格式,现在就让小编带大家了解这些方法吧~ 系统自带转格式的两种方法 Mac系统: 打开LaunchPad→Other→磁盘工具,如下图: 找到你的磁盘分区,选择需要的磁…

计算机分区格式转换,怎么将GPT分区格式转换成MBR分区格式

步骤方法&#xff1a; 1、进入U盘PE系统后运行桌面上的“DiskGen分区工具”并点击顶端“硬盘”中的“删除所有分区” 2、删除所有分区后可以看到硬盘旁边显示空闲40.0GB&#xff0c;同时背景是灰色的。 3、点击上方的“快速分区”图标 4、在弹出“分区表已更改且尚未保存”提示…