基本概念

JS单线程:我们都知道JavaScript它是一个单线程的语言,同一时间只能做一件事。比如:在浏览器中,某一时刻我们在操作DOM,你们这个时刻我们就不能去运行JavaScript代码,反过来也是,当我们在运行JavaScript代码的时候,我们也不能去操作DOM,这个也就是JS的单线程。为什么要JS成单线程?因为在浏览器环境下,如果是多线程的,也就是操作DOM和运行JavaScript代码是并行处理的话,假如某个时刻,浏览器正在绘制DOM,但是这个时候的JavaScript代码改变了DOM,这样就会造成一个不一致,因此JS就被设计成了一门单线程语言。

虽然JS是单线程,但是它的宿主,我们的浏览器环境(node环境)它是一个多线程的,在浏览器和node里面只有一条JS线程,但是还有很多其他的线程。以浏览器为例,浏览器的常驻线程(如下)大概有前三个:第一个,UI线程,也就是DOM浏览器元素的回流和重绘,这个UI线程与JavaScript线程是互斥的。第二个就是JavaScript线程,单线程的运行JS代码。第三个是GUI线程,它主要是处理与用户交互的一些逻辑,比如点击某一个元素,拖动了或者缩放了这个就是由GUI线程处理的。除此之外还有NetWorker线程,网络线程,发送ajax请求,发送http请求都是走的network线程。还有File线程,读取文件。还有一个定时器线程。

  • UI线程 - 回流和重绘 - 与Javascript线程互斥
  • JavaScript线程 - 单线程运行JavaScript
  • GUI线程 - 交互线程
  • Network线程
  • File线程
  • 定时器线程

这里可能会有一个问题是ajax请求对于JS来说是异步的,但是JavaScript是单线程的,这样就涉及到了一个基于事件的驱动。当我们发起一个网络请求时,浏览器会把这一部分网络请求交给network线程去处理,然后JavaScript线程等待network的指令驱动。在没有代码要运行的情况下,JavaScript线程始终是空闲的,有了事件驱动之后,它会一直处于一个轮询的状态(Event Loop),浏览器会不断查询目前是否有JavaScript线程需要运行,如果有就运行,没有就保持闲置。当一个网络请求发送出去,这个时候的JavaScript线程是处于闲置的,但是浏览器还是会不停的询问,当network线程结束后,浏览器发现有新的JavaScript代码需要执行,它就会驱动JavaScript的线程去处理网络请求返回的结果,这个就是JS 基于事件驱动的模型。

Event Loop(事件轮询图)

异步是将耗时比较长的任务放置到Event Queue 事件队列的尾部。

WebWorker

WebWorker为了解决浏览器假死这个问题而孕育而生的一项新技术。它是多线程模型,也是基于宿主。它属于JavaScript线程中的一个子线程,它完全受主线程控制,但是在WebWorker里面是不能操作DOM的。因为上面提到的UI线程和JavaScript线程是互斥的,这个互斥也就保证了DOM的唯一性,因此主的基调不能改变,但是需要有一个新的线程来分担繁杂的计算任务,这个也就是WebWorker。

浏览器的兼容性

应用场景

WebWorker是为了处理影响UI线程的JavaScript运算。因为在同一时刻,UI线程和JavaScript线程只能有一个在运行,如果这个时候JS的线程承担过多运算的话,它的耗时就变得很长,这个时候的UI线程是没有反应的,这样就造成了页面的假死。

WebWorker特点

  • 一旦新建就会始终运行,不会被主线程打断。即使主线程卡死了,WebWorker依然在运行。
  • 同源限制,对于同一个WebWorker来讲,只有同源的网页才能够访问。
  • 不能操作和访问DOM(window、document),因为要保证DOM 的唯一性。
  • 不能使用包含交互的全局方法(alert、confirm),但是可以使用XMLHttpRequest、setTimeout、setInterval
  • 不能读取本地文件(不止WebWorker不能读取,JavaScript主线程也不能读取),出于安全性的考虑,浏览器是不允许js读取本地文件的。
  • WebWorker分为两个:dedicated web worker(专用线程) ,只有一个网址一个页面可以使用这个线程和 shared web worker(共享线程),多个同源的网页可以共享一个WebWorker,这样为跨页面通信提供了一种可能。

基本用法

  • 创建WebWorker
const webWorker = new Worker('main.js');
let result = 0;
const fibonacci = (n) => {if (n <= 1) return 1;return fibonacci(n - 1) + fibonacci(n - 2);
}
​
result = fibonacci(10);
console.log('result', result);

  • 向WebWorker发送消息(数据)
webWorker.postMessage({ number : 10 });

  • WebWorker接收消息
webWorker.addEventListener('message', event => {console.log('received webworker data', event.data);
}, false);

  • WebWorker发送消息(返回数据)
this.postMessage(returnValue);

  • 主线程接收WebWorker消息
webWorker.addEventListener('message', event => {console.log('received webworker data', event.data);
}, false);

  • 关闭WebWorker
方式一:在主线程关闭WebWorker
webWorker.terminate();
​
方式二:在子线程,WebWorker内部自己调用自己的close方法,不再接收新的 Macrotask(宏任务)
this.close();

WebWorker调用脚本

importScripts('./one.js', './two.js');

WebWorker错误监听

webWorker.addEventListener('error', error => {console.error(error.filename, error.lineno, error.message);
});

webworker应用场景_初始WebWorker相关推荐

  1. webworker应用场景_典型应用场景 · OpenResty最佳实践-最新版 · 看云

    # 典型应用场景 可以这样说,任何一个开发语言.开发框架,都有它存在的明确目的,重心是为了解决什么问题.没有说我们学习一门语言或技术,就可以解决所有的问题.同样的,`OpenResty`的存在也有其自 ...

  2. 小说下载阅读器_初始简单版

    小说下载阅读器_初始简单版 相信园子里面的很多人和我一样喜欢阅读小说,下面是这几年用的比较多一点的阅读器,功能相对完整. Windows本地程序/手机 1.http://www.mybook66.co ...

  3. webworker应用场景_JavaScript 工作原理之七-Web Workers 分类及 5 个使用场景

    Web Workers 分类及 5 个使用场景 这是 JavaScript 工作原理的第七章. 本系列持续更新中,Github 地址请查阅这里. 现在,我们将会剖析 Web Workers:我们将会综 ...

  4. threadlocal使用场景_深入剖析ThreadLocal

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 朋友们在遇到线程安全问题的时候,大多数情况下可能会使用synchronized关键字,每次只允许一个线程进入锁定的方法或代码块,这样就可以保 ...

  5. redis watch使用场景_[Redis] 常用类型及应用场景

    主要类型字符串(strings,bitmaps) 散列(hashes) 列表(lists) 集合(sets) 有序集合(sorted sets) hyperloglogs 发布订阅(pub/sub) ...

  6. 嵌入式系统分类及其应用场景_词嵌入及其应用简介

    嵌入式系统分类及其应用场景 Before I give you an introduction on Word Embeddings, take a look at the following exa ...

  7. ue4怎么用虚幻商城场景_【更新】UE4虚幻引擎野外场景制作零基础入门教程

    原标题:[更新]UE4虚幻引擎野外场景制作零基础入门教程 作为一套零基础入门教程,可以帮助虚幻4引擎的新手了解到环境制作流程和相关软件的配合.本教学适合零基础入门用户,不适合有一定经验的UE使用者. ...

  8. mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?

    大家听过 MySQL MGR 技术吗? MySQL 是目前最流行的开源关系型数据库,国内金融行业也开始全面使用,其中MySQL 5.7.17 提出的 MGR(MySQL Group Replicati ...

  9. map和foreach的区别和应用场景_支付宝小程序和微信小程序,两者有何区别?

    原标题:支付宝小程序和微信小程序,两者有何区别? 自2017年1月微信推出小程序之后,小程序的发展势头便愈来愈猛.作为腾讯老对头的阿里,也开始投入小程序的研发.在一年多的开放公测后,支付宝小程序终于于 ...

最新文章

  1. ios开发学习笔记--调用相册或相机(UIImagePickerController)
  2. synchronized 异常_面试官,别挂电话,Synchronized,我还能说上半小时
  3. 用Win2003做×××借线
  4. ifconfig知识总结
  5. matlab 平滑曲线连接_Matlab的5个控制类工具箱介绍
  6. C# 方法练习-制作简易飞行棋游戏
  7. 华硕k43tk拆机清灰教程
  8. 天啦噜,竟然用AI来点名!你还敢逃课吗
  9. 常见HTML符号转换整理
  10. 七年时间,微软智能云在中国走过的“大江大河”
  11. QQ第三方登录(PC + 手机)
  12. Android 文字测量
  13. 叠加等边三角形的绘制 python_《叠》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  14. 如何通过ADB命令的方式关闭华为系手机的emui系统更新升级?解决:error: no devices/emulators found
  15. 基于队列数据的RR及其95%CI计算
  16. VS2010+OSG3.2+CEGUI0.8.4环境下实现简单的HelloWorld程序
  17. 【第二辑】临床路径论文、系统及其他资料汇总【15个】
  18. 1046: 奇数的乘积 C语言
  19. ES6模块化与异步编程高级用法
  20. 基于51单片机密码锁(修改密码,串口上锁解锁,仿真)

热门文章

  1. 机器学习基础(四十二)—— 常用损失函数的设计(multiclass SVM loss hinge loss)
  2. Python 进阶—— list 的头插和尾插
  3. 传递给 left 或 substring 函数的长度参数无效_MySQL:函数入门实例
  4. centos安装mysql5.7.26_Centos安装mysql5.7.26
  5. testmeshpro合批_TextMesh Pro新手使用手册
  6. 为何python不好找工作-为什么python不好找工作
  7. 如何自学python知乎-马哥教育官网-专业Linux培训班,Python培训机构
  8. 安装完python怎么打开-python安装后怎么启用
  9. python常用代码大全-python基础,python基础代码大全
  10. python菜鸟教程100例-Python 练习实例14