HTML5中怎么实现多线程
这篇文章将为大家详细讲解有关HTML5中怎么实现多线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
成都创新互联公司专注于舟山企业网站建设,成都响应式网站建设公司,购物商城网站建设。舟山网站建设公司,为舟山等地区提供建站服务。全流程按需求定制网站,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务
一、明确 JavaScript 是单线程
JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。
听起来有些匪夷所思,为什么不设计成多线程提高效率呢?我们可以假设一种场景:
假定 JavaScript
同时有两个线程,一个线程在某个 DOM
节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
作为浏览器脚本语言, JavaScript
的主要用途是与用户互动,以及操作 DOM
。
这决定了它只能是单线程,否则会带来很复杂的同步问题。为了避免复杂性,从一诞生, JavaScript
就是单线程,这已经成了这门语言的核心特征,估计短期内很难改变。
二、新曙光:Web Worker
单线程始终是一个痛点,为了利用多核 CPU
的计算能力, HTML5
提出 Web Worker
标准,允许 JavaScript
脚本创建多个线程。但是子线程完全受主线程控制,且不得操作 DOM
。
所以,这个新标准并没有改变 JavaScript
单线程的本质。
Web Workers
是现代浏览器提供的一个 JavaScript
多线程解决方案,我们可以找到很多使用场景:
1.我们可以用 Web Worker
做一些大计算量的操作;
2.可以实现轮询,改变某些状态;
3.页头消息状态更新,比如页头的消息个数通知;
4.高频用户交互,拼写检查,譬如:根据用户的输入习惯、历史记录以及缓存等信息来协助用户完成输入的纠错、校正功能等
5.加密:加密有时候会非常地耗时,特别是如果当你需要经常加密很多数据的时候(比如,发往服务器前加密数据)。
6.预取数据:为了优化网站或者网络应用及提升数据加载时间,你可以使用 Workers
来提前加载部分数据以备不时之需。
加密是一个使用 Web Worker
的绝佳场景,因为它并不需要访问 DOM
或者利用其它魔法,它只是纯粹使用算法进行计算而已。随着大众对个人敏感数据的日益重视,信息安全和加密也成为重中之重。这可以从近期的 12306 用户数据泄露事件中体现出来。
一旦在 Worker 进行计算,它对于用户来说是无缝地且不会影响到用户体验。
三、兼容性
四、基本概念
1.首先记得去判断是否支持
if (window.Worker) { ... }
2.创建一个新的 worker
很简单
const myWorker = new Worker('worker.js');
postMessage() 方法和 onmessage 事件处理函数是 Workers 的黑魔法。
3. postMessage
用来发送消息,而 onmessage
用来监听消息
const worker = new Worker('src/worker.js'); worker.onmessage = e => { console.log(e.data); }; worker.postMessage('你好吗!');
在主线程中使用时, onmessage
和 postMessage()
必须挂在 worker
对象上,而在 worker
中使用时不用这样做。原因是,在 worker
内部, worker
是有效的全局作用域。
4.异常处理:
worker.onerror = function(error) { console.log(error.message); throw error; };
5.终止 worker
worker.terminate();
worker
线程会被立即杀死,不会有任何机会让它完成自己的操作或清理工作。
6.在 worker
线程中, workers
也可以调用自己的 close
方法进行关闭:
close();
五、快速开始
为了快速掌握,我们来做一个小例子:项目结构如下
├── index.html └── src ├── main.js └── worker.js
Html
Web Work Demo Hello Jartto!