文档章节

HTML5 Web Workers

nao
 nao
发布于 2015/12/10 18:52
字数 1209
阅读 97
收藏 6

Web workers 是什么

    Web workers 是HTML5标准的一部分, 这一规范定义了一套API,它允许一段JavaScript程序运行在主线程以外的另外一个线程中。Web Workers 规范中定义了两类工作线程,分别是专用线程Dediacted worker 和共享线程 Shared Worker, 其中, Dedicated Woker 只能为一个页面所使用,而Shared Worker 则可以被多个页面所共享,本文示例为专用线程Dedicated Worker.


一个小例子

下载地址:https://github.com/mdn/simple-web-worker

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width">

    <title>Web Workers basic example</title>

    <link rel="stylesheet" href="style.css">
    <!--[if lt IE 9]>
      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
  </head>

  <body>
    <h1>Web<br>Workers<br>basic<br>example</h1>

    <div class="controls" tabindex="0">

    <form>
      <div>
        <label for="number1">Multiply number 1: </label>    
        <input type="text" id="number1" value="0">
      </div>
      <div>
        <label for="number2">Multiply number 2: </label>   
        <input type="text" id="number2" value="0">
      </div>
    </form>

    <p class="result">Result: 0</p>

    </div>
  </body>
  <script src="main.js"></script>
</html>

main.js

var first = document.querySelector('#number1');
var second = document.querySelector('#number2');

var result = document.querySelector('.result');

if (window.Worker) { // Check if Browser supports the Worker api.
    // Requries script name as input
    var myWorker = new Worker("worker.js");

// onkeyup could be used instead of onchange if you wanted to update the answer every time
// an entered value is changed, and you don't want to have to unfocus the field to update its .value

    first.onchange = function() {
      myWorker.postMessage([first.value,second.value]); // Sending message as an array to the worker
      console.log('Message posted to worker');
    };

    second.onchange = function() {
      myWorker.postMessage([first.value,second.value]);
      console.log('Message posted to worker');
    };

    myWorker.onmessage = function(e) {
        result.textContent = e.data;
        console.log('Message received from worker');
    };
}

worker.js

onmessage = function(e) {
  console.log('Message received from main script');
  var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
  console.log('Posting message back to main script');
  postMessage(workerResult);
}

简单小结:

    Web主线程:

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

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

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

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

    worker新线程:

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

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

    3.可以使用self.close()来终止一个worker的执行。


API 进阶

    关于 web workers, 最重要的是要知道它执行的javascript代码完全在另一个作用域中,与当前网页中的代码不共享作用域。在web workers中,同样有一个全局对象(woker对象本身,this和self 引用的都是worker对象本身)和其他对象以及方法。

Web worker中的代码不能访问Dom.

在worker线程中,可以获得下列对象

    1 .navigator对象

    2. location对象,只读

    3. XMLhtttpRequest独享

    4. setTimeout/setInterval方法

    5. Application Cache

    6. 通过importScripts()方法加载其他脚本

    7. 创建新的Web Worker

worker线程不能获得下列对象:

    1. DOM对象

    2. window对象

    3. document对象

    4. parent对象

上述的规范,限制了在worker线程中获得主线程页面相关对象的能力,所以在worker线程中,不能进行dom元素的更新。


 Web workers带来了什么

    1. Web workers 带来后台计算能力

    Web workers 自身是由webkit多线程实现,但他并没有为javascript语言带来多线程编程特性,我们现在仍然不能在javascript代码中创建并管理一个线程,或者主动控制线程间的同步与锁等特性。

    Web workers典型应用场景

    既然Web workers 为浏览器端javascript带来了后台计算能力,我们可以利用这一能力,将更新数据和对象状态的耗时部分交由Web workers执行,提升页面性能。

    部分典型的应用场景如下:

    1. 使用专用线程进行数学运算

    Web workers 最简单的应用就是用来做后台计算,而这种计算并不会中断前台用户的操作。

    2. 图像处理

    通过使用<canvas>或者<video>元素中获取的数据,可以把图像分割成几个不同的区域并且把它们推送给并行的不同workers来做计算。

    3. 大量数据的检索

    但需要在调用ajax后处理大量的数据,如果处理这些数据所需的时间长短非常重要,可以在Web workers中来做这些,避免冻结UI线程。

    4. 背景数据分析

    由于在使用 Web Workers的时候,我们有更多潜在的CPU可用时间,我们现在可以考虑一下javascript中的新应用场景。

    例如, 我们可以想象在不影响UI体验的情况下实时处理用户输入。利用这样一种可能,我们可以想象一个像word一样的应用:当用户打字时,后台在词典中进行查找,帮助用户自动纠错等等。 


参考文章:

https://developer.mozilla.org/en-US/docs/Web/API/Worker

http://www.ibm.com/developerworks/cn/web/1112_sunch_webworker/index.html

http://www.tools138.com/create/article/20151111/020119942.html




© 著作权归作者所有

共有 人打赏支持
nao

nao

粉丝 28
博文 155
码字总数 108102
作品 0
成都
后端工程师
私信 提问
HTML5编程之旅 第5站Web Workers

HTML5 Web Workers可以使得你的Web应用程序具备后台处理能力,能够支持多线程,且可以充分利用多核CPU带来的优势。以避免JavaScript循环持续运行后弹出的警告窗口。 尽管Web Workers功能强大...

倪伟伟
2014/02/28
0
0
实测 Android 4.0 操作系统性能有很大提高

据国外媒体报道,谷歌和苹果近日均高调发布各自最新款的操作系统。谁会更受到市场的亲睐呢,是谷歌的 Android 4.0 Ice Cream Sandwich(代号为“冰淇淋三明治”)还是苹果的Apple iOS 5?其中...

红薯
2011/12/21
3.6K
13
最新 Opera 10.60 更好的支持 HTML5 标准

前些日子刚刚发布的 Opera 10.60 版本,该版本在 HTML5 的支持上得到更多的改进。 主要包括: 为 HTML5 视频增加 WebM 的支持 (demo) HTML5 离线 Web 应用的支持 (demo) Geolocation (demo –...

红薯
2010/06/14
1K
2
9 个用来加速 HTML5 应用的方法

Web 开发者经常在找一些新的方法来不断的提升页面的速度和性能,而 HTML5 的很多新特性可以实现,让用户有着更好的体验,在这里我们整理了 9 中简单易于实现的 HTML5 技巧,或许可以对你有所...

彭博
2012/11/27
212
0
Mozilla 发布多人 HTML5 游戏 BrowserQuest 及源码

近日,Mozilla 上线了一款支持多人在线的 HTML5 游戏 BrowserQuest ,来展示 HTML5 功能的强大。 该游戏主要使用 HTML5 进行开发,在游戏中,玩家扮演一个年轻的战士,在危险的世界中展开冒险...

墙头草
2012/03/28
5.9K
17

没有更多内容

加载失败,请刷新页面

加载更多

初探Spring Cloud(一)

1. 什么是Spring Cloud? Spring提供了一系列工具,可以帮助开发人员迅速搭建分布式系统中的公共组件(比如:配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,...

__HuWei
19分钟前
0
0
Mac配置ssh免密钥登录

Mac终端每次使用ssh -p 22 user@ip登录很是麻烦,下面介绍配置ssh免密钥登录: cd ~/.ssh下创建conf文件,写入以下配置: Host test HostName ip Port 22 IdentityFile /Users/t/key/test.p...

littlemesieV
34分钟前
1
0
Spark2.0操作ES

ES提供了支持包来方便的操作ES。首先添加ES的依赖maven: <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>6.2.0</ver......

守望者之父
35分钟前
1
0
专业术语

1、防御性编程 DruidDataSource类有一个init方法,我们在spring中配置druid时,都会指定 init-method='init'. 而且DruidDataSource也在其他地方,诸如getConnection()方法里作了防御性编程, 也就...

still5656
37分钟前
1
0
微信开发--测试账号相关

1、微信公众平台选择代码开发后,其平台上的部分功能会不可用 可在开发者工具中选择开通测试账号,进行相关的功能调试(测试账号出微信支付不可调试外,其他功能基本上都可以调试) 2、测试账号...

Code辉
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部