html5 Web Workers

虽然在JavaScript中有setInterval和setTimeout函数使javaScript看起来好像使多线程执行,单实际上JavaScript使单线程的,一次只能做一件事情(关于JavaScript单线程可以看看setTimeout()和setInterval() 何时被调用执行),看个简单的例子证明一下

<!DOCTYPE html>
<html>
<head>
    <title>Web Workers</title>
</head>
<body>
    <h1>Web Workers</h1>

    <script type="text/javascript">
    setTimeout(function(){
        console.log('timeout function');
    },1000);
    alert('do not close');
    </script>
</body>
</html>

页面一运行就会弹出一个对话框,如果setTimeout是在另外一个线程运行,那么过一秒钟控制台就会打印“timeout function”,事实是只要不关闭对话框,控制台永远不会输出文字,这两句话确实是在一个线程内运行的。

这样的设计使JavaScript比较简单,但有时候也很令人烦恼,因为单线程的设计意味着JavaScript代码必须很快运行完,常见的问题就 是一段复杂的JavaScript脚本会中断页面其它脚本执行,甚至会出现页面失去响应,这也就是为什么ajax的API要设计成异步的。

Web Workers

在html5规范中引入了web workers概念,解决客户端JavaScript无法多线程的问题,其定义的worker是指代码的并行线程,不过web worker处于一个自包含的环境中,无法访问主线程的window对象和document对象,和主线程通信只能通过异步消息传递机制。 (《JavaScript权威指南》)

web worker

我们需要把希望单独执行的javascript代码放到一个单独的js文件中,然后在页面中调用Worker构造函数来创建一个线程,参数是该文件 路径,参数存放如果是相对地址,那么要以包含调用Worker构造函数语句所在脚本为参照,如果是绝对路径,需要保证同源(协议+主机+端口)。这个文件 不需要我们在页面使用script标签显示引用

var worker=new Worker('js/worker.js');

这时候这个文件就会被异步加载并在后台执行,创建成功地worker是酱紫的

我们可以看到worker对象只有两个属性,其实是两个回调函数句柄

  1. onerror:当worker运行出现错误,并且没有在worker中ing捕获,会在此捕获
  2. onmessage:当worker向主线程发送消息是调用

在其prototype内有两个重要方法

  1. postMessage:很熟悉的赶脚,之前我们介绍过window对象的postMessage()方法,woker的postMessage方法和window的比较类似,但参数略有不同,只需要传递消息内容就可以,而且支持所有JavaScript原生数据类型,当然不放心的话同样也可以序列化为字符串传递
  2. terminate:终止worker执行,有些worker执行比较慢,主线程可以主动终止其执行

简单的小例子

在一个页面显示0~10000内所有可以被n整除的数,当然我们不用i*n这种,要略微使计算显得复杂一些嘛

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Web Workers</title>
</head>
<body>
  <h1>Web Workers</h1>

      <div id="test" style="width:500px;"></div>
    <script type="text/javascript">
        var worker=new Worker('js/worker.js');
        worker.postMessage({
            n:69
        });

        worker.onmessage=function(e){
            var test=document.getElementById('test').innerHTML=e.data;       
        };
    </script>
</body>
</html>

/js/worker.js

function calc(n){
    var result=[];
    for(var i=1;i<10000;i++){
        var tem=i;
        if(i%n==0){
            if(i%(10*n)==0){
                tem+='<br/>';
            }
            result.push(tem);
        }
    }

    self.postMessage(result.join(' '));
    self.close();
}

onmessage=function(e){
    calc(e.data.n);
};

 

 好像有几点没提到

worker.onmessage

绑定主线程的message事件,当worker调用postMessage时方法时,绑定的事件处理程序会被调用到,传递来的数据可以使用MouseEvent的data属性获取,通过target属性还可以获取worker对象

self是什么

self是woker中对自身的引用,有些像this

close()

在worker内部调用close()方法效果和在外部调用worker实例的terminate()方法效果一样,终止worker运行

onmessage

在这个句柄内接收外部调用者传递的参数,参数可以通过e.data获取

self.postMessage()

没错通过这个方法我们可以在worker内把结果传递给主线程,主线程上绑定的message事件的处理程序会被调用

worker的作用域

web worker的简单用法就是这样,但有些姿势还是得了解一下。

全新的JavaScript环境

当一个Worker实例被创建的时候,它会在一个全新的JavaScript运行环境中,完全和创建worker的脚本分离开,即使我们传递的消息是引用类型它们也是复制传递的,修改worker中的参数不影响创建脚本中的参数。

importScripts()

我们可以通过importScripts()方法通过url在worker中加载库函数,

importScripts('utility/dialog.js','common/cookie.js');

方法可以接受多个url,相对地址的url以当前worker为参照,方法会按照参数顺序依次下载运行库函数,如果中间某个脚本出错,剩下的都不会被载入和执行,而且这个方法是同步的,只有所有脚本都加载、运行完后才会返回。

worker执行模型

worker线程从上到下同步运行它的代码,然后进入异步阶段来对事件及计时器响应,如果worker注册了message事件处理程序,只要其有 可能触发,worker就一直在内存中,不会退出,但如果worker没有监听消息,那么当所有任务执行完毕(包括计数器)后,他就会退出。

web worker中可以使用什么

 前面提到在worker中不能使用window对象和docuemnt对象,那么能够使用什么呢

  • JavaScript的全局对象:JSON、Date()、Array
  • self自身引用
  • location对象,但是其属性都是只读的,改了也影响不到调用者
  • navigator对象
  • setTimeout()、setInterval()及其对应清除方法
  • addEventListener()、removeEventListener()

最后

web worker还支持sub worker和共享worker,这方面没有太仔细看,浏览器兼容性也不讨理想,有兴趣同学可以上网搜索研究一下。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 线程
, 页面
, function
, worker
, 一个
, js终止执行
javascript多线程
,以便于您获取更多的相关知识。

时间: 2024-08-31 06:57:14

html5 Web Workers的相关文章

HTML5移动应用开发第4章:Web Workers来加速您的移动Web应用

在本文中,您将使用最新的 Web 技术开发 Web 应用程序.这里的 大部分代码只是 HTML.JavaScript 和 CSS - 所有 Web 开发人员的核心技术.所需的最重要的工具是用于进行测试的浏览器.本文大部分代码将在最新桌面浏览器上运行,但也有一些例外,我们将在文章中进行说明.当然,您也必须在移动浏览器上测试,为此,您需要最新的 iPhone 和 Android SDKs.本文将使用 iPhone SDK 3.1.3 和 Android SDK 2.1.本文的样例还将使用一个代理服务

HTML5 Web Worker

在 HTML5 中提出了工作线程(Web Workers)的概念,即多线程概念,可以将一些大量计算的代码交给web worker运行而不冻结用户界面. Web Workers 的三大主要特征: 1)能够长时间运行(响应) 2)理想的启动性能 3)理想的内存消耗 Web Workers 允许开发人员编写能够长时间运行而不被用户所中断的后台程序,去执行事务或者逻辑,并同时保证页面对用户的及时响应. Web Workers 为 Web 前端网页上的脚本提供了一种能在后台进程中运行的方法.一旦它被创建,

HTML5 Web Storage

简介 HTML5 web storage, better than cookies. more secure and faster data store in name/value pairs the storage limit is at least 5MB     1. 发展过程:       2. 浏览器支持情况:       3. HTML5 Web Storage 提供如下两种对象: window.localStorage - stores data with no expiratio

利用Web存储工具创建HTML5 Web应用程序

HTML5 提供了新的语义元素,还提供了恰当的使用应用程序缓存器.JavaScript worker.新版本的 XMLHttpRequest 和一种名为 Web 存储的工具创建 HTML Web 应用程序的方式.本文将探讨 Web 存储的强大功能,以及它成为一种优于 cookies 的存储方法的原因.通过本文您将了解基本概念.浏览器支持和 HTML5 Web 存储对象. Cookies 从 JavaScript 出现之初就一直存在,所以在 Web 上存储数据并不是个新概念.不过Web 存储是数据

Html5 Web的5中离线存储方式之localStorage

Html5 Web的5中离线存储方式之localStorage 在HTML5越来越流行的今天,如果你还不知道离线存储,那就说明你落后了很多. HTML5的离线存储方式有多种:Web SQL Database.LocalStorage.Cookie.WebStorage.IndexedDB.FileSystem. Web SQL Database目前虽然还有浏览器支持,是唯一的关系数据库结构的存储,但W3C以及停止对其的维护和发展.我就不多说了. 今天我们主要看LocalStorage这种最简单的

关于Web Workers你需要了解的七件事

介绍 Web Workers允许你在后台运行JavaScript代码,而不会阻止web用户界面.Web Workers可以提高网页的整体性能,还可以增强用户体验.Web Workers有两种风格 --专用Web Workers和共享Web Workers.本文讨论了你所需要知道的Web worker的七个关键方面,帮助你决定在应用程序中使用它们的话. 1.Web Workers允许你在后台运行JavaScript代码 通常,你在Web页面中编写的JavaScript代码在与用户界面相同的线程中执

不使用额外的js文件创建 web workers

问题 web workers 需要将要执行的代码,定义为单独的js,然后通过以下方式来引用 new Worker('some/path/process.js') 但是,当工程本身需要将所有的代码进行编译并合并成一个文件时,这种单独的js的方式,就还需要一些特殊处理. 或者,当页面就是一个单独的html,不希望引用额外的js文件时,web workers本身的初始化方式都会有些不方便. 解决 根据 Worker 的 API,可以基于 Blobs 构建 Worker 实例. 目前,没有什么官方指导的

JavaScript多线程之HTML5 Web Worker

在博主的前些文章Promise的前世今生和妙用技巧和JavaScript单线程和浏览器事件循环简述中都曾提到了HTML5 Web Worker这一个概念.在JavaScript单线程和浏览器事件循环简述中讲述了JavaScript出于界面元素访问安全的考虑,所以JavaScript运行时一直是被实现为单线程执行的:这也意味着我们应该尽量的避免在JavaScript中执行较长耗时的操作(如大量for循环的对象diff等)或者是长时间I/O阻塞的任务,特别是对于CPU计算密集型的操作. 例如在Jav

html5-开发HTML5 web和移动app用什么开发工具好呢?

问题描述 开发HTML5 web和移动app用什么开发工具好呢? 看了些html5的一些新闻,有推荐使用HBuilder的,试了下,是挺快的. 但是不知道现在主流的开发工具是什么? http://www.25xt.com/html5css3/6817.html 这个网站说2015必火的5个开发工具 解决方案 其实最牛逼的一种方式是用text文件编写,或者用Editplus这种方式比较好,特别是对于初学者来说.