https://www.cnblogs.com/yanan-boke/p/6954390.html

https://segmentfault.com/a/1190000014938305

HTML5 工作线程原理

传统上的线程可以解释为轻量级进程,它和进程一样拥有独立的执行控制,一般情况下由操作系统负责调度。而在 HTML5 中的多线程是这样一种机制,它允许在 Web 程序中并发执行多个 JavaScript 脚本,每个脚本执行流都称为一个线程,彼此间互相独立,并且由浏览器中的 JavaScript 引擎负责管理。下面我们将详细讲解 HTML5 的工作线程原理。

Web Workers 是浏览器内置的线程所以可以被用来执行非阻塞事件循环的 JavaScript 代码。

在 HTML5 中引入的工作线程使得浏览器端的 JavaScript 引擎可以并发地执行 JavaScript 代码,从而实现了对浏览器端多线程编程的良好支持。将可能耗费较长时间的处理交给后台执行,则对用户在前台页面中执行的操作没有影响。

HTML5 中的 Web Worker 可以分为两种不同线程类型,一个是专用线程 Dedicated Worker,一个是共享线程 Shared Worker。两种类型的线程各有不同的用途。

应用场景一:使用工作线程做后台数值复杂(算法)计算

应用场景二:使用共享线程处理多用户并发连接

应用场景三:高频的用户交互

应用场景四:监听由后台服务器广播的消息

例子:

  1. //worker.js
    onmessage =function (evt){
    var d = evt.data;//通过evt.data获得发送来的数据
    postMessage( d );//将获取到的数据发送会主线程
    }

HTML页面:test.html

  1. <!DOCTYPE HTML>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script type="text/javascript">
    //WEB页主线程
    var worker =new Worker("worker.js"); //创建一个Worker对象并向它传递将在新线程中执行的脚本的URL
    worker.postMessage("hello world"); //向worker发送数据
    worker.onmessage =function(evt){ //接收worker传过来的数据函数
    console.log(evt.data); //输出worker发送来的数据
    }
    </script>
    </head>
    <body></body>
    </html>

使用web worker主要分为以下几部分:

WEB主线程:

1.通过 worker = new Worker( url ) 加载一个JS文件来创建一个worker,同时返回一个worker实例。

2.通过worker.postMessage( data ) 方法来向worker发送数据。

3.绑定worker.onmessage方法来接收worker发送过来的数据。

4.可以使用 worker.terminate() 来终止一个worker的执行。

worker新线程:

1.通过postMessage( data ) 方法来向主线程发送数据。

2.绑定onmessage方法来接收主线程发送过来的数据。

Web Workers能够为用户做些什么?

加载一个JavaScript文件,进行大量的复杂计算,而不挂起主进程,并通过postMessage和onMessage进行通信。

可以在WoOer(worker)中通过importScripts(url)方法加载另外的JavaScript脚本文件。

可以使用setTimeout()、clearTimeout()、setInterval()和clearInterval()。

可以使用XMLHttpRequest进行异步请求。

可以访问navigator的部分属性。

可以使用JavaScript核心对象。

监听由后台服务器广播的消息。

web Workers的局限性:

1.不能跨域加载JS

2.worker内代码不能访问DOM()、window 对象、document 对象、parent 对象

3.各个浏览器对Worker的实现不大一致,例如FF里允许worker中创建新的worker,而Chrome中就不行

4.不是每个浏览器都支持这个新特性

ECMscript规定的一些基本语法以及规定的一些操作。如下操作:

•navgator :  ppVersion、userAgent、platform
•location  :   所有属appName、a性都是只读的
•self  :  指向全局 worker 对象
•所有的ECMA对象,Object、Array、Date等
•XMLHttpRequest构造器
•setTimeout和setInterval方法
•close()方法,立刻停止worker运行
•importScripts方法

Web Workers 最佳使用场景

迄今为止,我们列举了 Web Workers 的长处及其限制。让我们看看他们的最佳使用场景:

  • 射线追踪:射线追踪是一项通过追踪光线的路径作为像素来生成图片的渲染技术。Ray tracing 使用 CPU 密集型计算来模仿光线的路径。思路即模仿一些诸如反射,折射,材料等的效果。所有的这些计算逻辑可以放在 Web Worker 中以避免阻塞 UI 线程。甚至更好的方法即-你可以轻易地把把图片的渲染拆分在几个 workers 中进行(即在各自的 CPU 中进行计算,意思是说利用多个 CPU 来进行计算,可以参考下 nodejs 的 api)。这里有一个使用 Web Workers 来进行射线追踪的简单示例-https://nerget.com/rayjs-mt/r...
  • 加密:端到端的加密由于对保护个人和敏感数据日益严格的法律规定而变得越来越流行。加密有时候会非常地耗时,特别是如果当你需要经常加密很多数据的时候(比如,发往服务器前加密数据)。这是一个使用 Web Worker 的绝佳场景,因为它并不需要访问 DOM 或者利用其它魔法-它只是纯粹使用算法进行计算而已。一旦在 worker 进行计算,它对于用户来说是无缝地且不会影响到用户体验。
  • 预取数据:为了优化网站或者网络应用及提升数据加载时间,你可以使用 Workers 来提前加载部分数据以备不时之需。不像其它技术,Web Workers 在这种情况下是最棒哒,因为它不会影响程序的使用体验。
  • 渐进式网络应用:即使在网络不稳定的情况下,它们必须快速加载。这意味着数据必须本地存储于浏览器中。这时候 IndexDB 及其它类似的 API 就派上用场了。大体上说,一个客户端存储是必须的。为了不阻塞 UI 线程的渲染,这项工作必须由 Web Workers 来执行。呃,当使用 IndexDB的时候,可以不使用 workers 而使用其异步接口,但是之前它也含有同步接口(可能会再次引入 ),这时候就必须在 workers 中使用 IndexDB。

    这里需要注意的是在现代浏览器已经不支持同步接口了,具体可查看这里

  • 拼写检查:一个基本的拼写检测器是这样工作的-程序会读取一个包含拼写正确的单词列表的字典文件。字典会被解析成一个搜索树以加快实际的文本搜索。当检查器检查一个单词的时候,程序会在预构建搜索树中进行检索。如果在树中没有检索到,则会通过提供替代的字符为用户提供替代的拼写并检测单词是否是有效-是否是用户需要的单词。这个检索过程中的所有工作都可以交由 Web Worker 来完成,这样用户就只需输入单词和语句而不会阻塞 UI,与此同时 worker 会处理所有的搜索和服务建议。

例子:

实际工作过程会遇到用户需要通过解析远程图片来获得图片 base64 的案例,那么这时候,如果图片非常大,就会造成 canvas 的 toDataURL 操作相当的耗时,从而阻塞页面的渲染。

所以解决思路即把这里的处理图片的操作交由 worker 来处理。以下贴出主要的代码:

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Canvas to base64</title>
  6. </head>
  7. <body>
  8. <script>
  9. function loadImageAsync(url) {
  10. if (typeof url !== 'string') {
  11. return Promise.reject(new TypeError('must specify a string'));
  12. }
  13. return new Promise(function(resolve, reject) {
  14. const image = new Image();
  15. // 允许 canvas 跨域加载图片
  16. image.crossOrigin="anonymous";
  17. image.onload = function() {
  18. const $canvas = document.createElement('canvas');
  19. const ctx = $canvas.getContext('2d');
  20. const width = this.width;
  21. const height = this.height;
  22. let imageData;
  23. $canvas.width = width;
  24. $canvas.height = height;
  25. ctx.drawImage(image, 0, 0, width, height);
  26. imageData = ctx.getImageData(0, 0, $canvas.width, $canvas.height);
  27. resolve({image, imageData});
  28. };
  29. image.onerror = function() {
  30. reject(new Error('Could not load image at ' + url));
  31. };
  32. image.src = url;
  33. });
  34. }
  35. function blobToDataURL(blob) {
  36. return new Promise((fulfill, reject) => {
  37. let reader = new FileReader();
  38. reader.onerror = reject;
  39. reader.onload = (e) => fulfill(reader.result);
  40. reader.readAsDataURL(blob);
  41. })
  42. }
  43. document.addEventListener("DOMContentLoaded", function () {
  44. loadImageAsync('https://cdn-images-1.medium.com/max/1600/1*4lHHyfEhVB0LnQ3HlhSs8g.png')
  45. .then(function (image) {
  46. // jpeg-web-worker.js https://github.com/kentmw/jpeg-web-worker
  47. const worker = new Worker('jpeg-web-worker.js');
  48. worker.postMessage({
  49. image: image.imageData,
  50. quality: 50
  51. });
  52. worker.onmessage = function(e) {
  53. // e.data is the imageData of the jpeg. {data: U8IntArray, height: int, width: int}
  54. // you can still convert the jpeg imageData into a blog like this:
  55. const blob = new Blob( [e.data.data], {type: 'image/png'} );
  56. blobToDataURL(blob).then((imageURL) => {
  57. console.log('imageUrl:', imageURL);
  58. })
  59. }
  60. })
  61. .catch(function (err) {
  62. console.log('Error:', err.message);
  63. });
  64. });
  65. </script>
  66. </body>
  67. </html>

以上是通过 canvas 来获取图片数据,那么是否有其它方法呢?肯定有的啦,动下脑筋吧少年。

HTML5中的Web Workers的更多相关文章

  1. html5中的Web Storage

    html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage.sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...

  2. HTML5学习(十)---Web Workers

    参考教程:http://www.w3school.com.cn/html5/html_5_webworkers.asp web worker 是运行在后台的 JavaScript,不会影响页面的性能. ...

  3. HTML5中的Web Worker

    什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面是不可响应的,直到脚本已完成. Web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.您 ...

  4. 聊聊HTML5中的Web Notification桌面通知

    有的时候我们会在桌面右下角看到这样的提示: 这种桌面提示是HTML5新增的 Web Push Notifications 技术. Web Notifications 技术使页面可以发出通知,通知将被显 ...

  5. HTML5中的Web Worker技术

    为了让后台程序更好的执行,在HTML5中设计了Web Worker技术.Web Worker的产生主要是考虑到在HTML4中JavaScript Web程序都是以单线程的方式执行的,一旦前面的脚本花费 ...

  6. HTML5中的Web Notification桌面通知(右下角提示)

    html5桌面通知(Web Notifications)对于需要实现在新消息入线时,有桌面通知效果的情况下非常有用,在此简单介绍一下这个html5的新属性.通过Web Notifications(桌面 ...

  7. HTML5新特性 Web Workers 实现多线程

    引子:(JS单线程) 什么是webworker? Web Worker为Web应用程序提供了一种能在后台中运行的方法.通过Web Worker可以生成多个线程同时运行,并保证页面对用户的及时响应,完全 ...

  8. 简单了解HTML5中的Web Notification桌面通知

    原文:http://www.zhangxinxu.com/wordpress/2016/07/know-html5-web-notification/ 需要注意的是,消息通知只有通过Web服务访问该页 ...

  9. HTML5中的Web Storage(sessionStorage||localStorage)理解与简单实例

    Web Storage是什么? Web Storage功能,顾名思义,就是在Web上针对client本地储存数据的功能,详细来说Web Storage分为两种: sessionStorage: 将数据 ...

随机推荐

  1. 机器学习中的L1、L2正则化

    目录 1. 什么是正则化?正则化有什么作用? 1.1 什么是正则化? 1.2 正则化有什么作用? 2. L1,L2正则化? 2.1 L1.L2范数 2.2 监督学习中的L1.L2正则化 3. L1.L ...

  2. 动态生成navmeshi-进击的新版NavMesh系统:看我飞檐走壁

    http://forum.china.unity3d.com/thread-25421-1-1.html0x00 前言 unity5.6作为Unity5最后的一个版本,的确起到了一个承上启下的作用.除 ...

  3. Android Studio如何导出可供Unity使用的aar插件详解

    http://www.cnblogs.com/xtqqkss/p/6387271.html 前言 项目之前使用Eclipse导出的jar文件来做与Android交互,最近因为工作需要需使用Androi ...

  4. scrapy爬取数据的基本流程及url地址拼接

    说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢!   了解内容: Scrapy :抓取数据的爬虫框架     异步与非阻塞的区别   异步:指的是整个过程,中间如果是非阻塞的,那就是异步 ...

  5. eclipse 通过svn导入maven工程

    http://blog.csdn.net/zdnlp/article/details/7238194

  6. react-native-contact 安卓已测试,

    1. 下载模块    npm install react-native-contacts --save 2.安卓配置: a.在android/settings.gradle include ':rea ...

  7. Jmeter (二十六)逻辑控制器 之 Module Controller and Include Controller

    Module Controller ---模块控制器 测试计划设置“独立运行没每个线程组” 线程组2中使用Module Controller执行线程组1中的Sampler: 紧接着,将线程组1disa ...

  8. ES6入门教程---解构赋值和字符串扩展

    解构赋值: ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 数组的解构赋值: 按照对应的顺序解构. var arr = [1,[2,3]]; ...

  9. 前端html与css学习笔记总结篇(超详细)

    第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的 ...

  10. 记录下这周的mysql调优工作

    这周一至周四基本都在做mysql的测试和调优工作,包括erlang端对mysql的写入测试,到今天为止暂且告一段落,下周先做下其他的开发.    测试环境    使用的测试环境是aliyun的杭州节点 ...