2017补全计划-多线程Worker-学习笔记

参考资料:
【转向Javascript系列】深入理解Web Worker

使用Web Workers - Web API 接口| MDN

深入 HTML5 Web Worker 应用实践:多线程编程

Web Worker在WebKit中的实现机制

Web Worker的用处:Web Worker带来后台计算能力

Web Worker 部分典型的应用场景:

使用专用线程进行数学运算,Web Worker最简单的应用就是用来做后台计算,而这种计算并不会中断前台用户的操作


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


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


背景数据分析,由于在使用Web Worker的时候,我们有更多潜在的CPU可用时间,我们现在可以考虑一下JavaScript中的新应用场景。例如,我们可以想像在不影响UI体验的情况下实时处理用户输入。利用这样一种可能,我们可以想像一个像Word(Office Web Apps 套装)一样的应用:当用户打字时后台在词典中进行查找,帮助用户自动纠错等等。

Web Worker 简单Demo :

main.html

<html>  
  <head>  
  <script type="text/javascript">  
    var worker = new Worker('worker.js');   
    var obj = {"first":1, "second":2};  
    worker.postMessage(obj);   
    worker.onmessage = function (event) {   
      alert(event.data);  
    }  

    function postMsg(){  
      if (worker)  
        worker.postMessage(obj);   
    }  
  </script>   
  </head>  
  <body>  
     <button onclick="postMsg()">post</button>  
  </body>  
</html> 
//并不需要使用script标签引入worker.js

worker.js

//当main.html里的js调用worker.postMessage()方法时
//线程到这里会自动调用onmessage 的callback函数
onmessage = function (event)   
{   
  var data = event.data;  
  var first=data.first;  
  var second=data.second;  
  handleTask(first,second);   
};   

function  handleTask(a, b)  
 {  
   var out = a + b;  
   postMessage("Worker Done! out = " + out);  
 }  

注: chrome浏览器可能会报错,因为chrome要求worker.js必须存在服务器端,建议练习多线程时候使用firefox

深入了解Web Worker:

HTML5 中的 Web Worker 可以分为两种不同线程类型,一个是专用线程 Dedicated Worker,一个是共享线程 Shared Worker
(后续补充,目前学习概念觉得太模糊)

补充概念点:

超时与间隔

Worker 能够像主线程一样使用超时与间隔。这会十分有用,比如说,如果你想让 worker 线程周期性而并非不间断的运行代码。

终止 worker

如果你想立即终止一个运行中的 worker,可以调用 worker 的 terminate()方法:

处理错误

当 worker 出现运行时错误时,它的 onerror 事件处理函数会被调用。它会收到一个实现了 ErrorEvent 接口名为 error的事件。该事件不会冒泡,并且可以被取消;为了防止触发默认动作,worker 可以调用错误事件的 preventDefault() 方法。

错误事件拥有下列三个它感兴趣的字段:

message
可读性良好的错误消息。
filename
发生错误的脚本文件名。
lineno
发生错误时所在脚本文件的行号。

访问 navigator 对象

Workers 可以在它的作用域内访问 navigator 对象。它含有如下能够识别浏览器的字符串,就像在普通脚本中做的那样:

引入脚本与库

Worker 线程能够访问一个全局函数,importScripts() ,该函数允许 worker 将脚本或库引入自己的作用域内。你可以不传入参数,或传入多个脚本的 URI 来引入;以下的例子都是合法的:

importScripts();                        /* 什么都不引入 */
importScripts('foo.js');                /* 只引入 "foo.js" */
importScripts('foo.js', 'bar.js');      /* 引入两个脚本 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值