部分增强Web技术(3)

三、Web Worker

1.概述

JavaScript语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力。

Web Worker的作用,就是为JavaScript创造多线程环境,允许主线程创建Worker线程,将一些任务分配给后者运行。在主线程运行的同时,Worker线程在后台运行,两者互不干扰。等到Worker线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被Worker线程负担了,主线程(通常负责UI交互)就会很流畅,不会被阻塞或拖慢。

Worker线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了Worker比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

2.注意

Web Worker有以下几个使用注意点:

(1)同源限制。分配给Worker线程运行的脚本文件,必须与主线程的脚本文件同源(同协议、同域名、同端口)。

(2)DOM 限制。Worker线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的DOM对象,也无法使用document、window、parent这些对象。但是,Worker线程可以使用navigator对象和location对象。

(3)脚本限制。Worker 线程不能执行alert()方法和confirm()方法,但可以使用XMLHttpRequest对象发出AJAX请求。

(4)文件限制。Worker线程无法读取本地文件,即不能打开本机的文件系统(file://),它所加载的脚本,必须来自网络。

(5)通信联系。Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。

3.基本用法

(1)主线程

主线程采用new命令,调用Worker()构造函数,新建一个Worker线程。

var worker = new Worker(‘...work.js‘);

Worker()构造函数的参数是一个脚本文件,该文件就是Worker线程所要执行的任务。由于Worker不能读取本地文件,所以这个脚本必须来自网络。如果下载没有成功(比如404错误),Worker线程的任务就会无法执行。

然后,主线程调用worker.postMessage()方法,向Worker发消息。这个方法的参数就是主线程传给Worker的数据,可以是各种数据类型,包括二进制数据,如:

worker.postMessage(‘Hello World‘);

worker.postMessage({method: ‘echo‘, args: [‘Work‘]});

接着,主线程通过worker.onmessage指定监听函数,接收子线程发回来的消息,事件对象的data属性可以获取Worker发来的数据:

worker.onmessage = function(event){

console.log(‘Received message ‘ + event.data);

}

Worker完成任务以后,主线程就可以通过worker.terminate();把它关掉,节约资源。

(2)Worker线程

Worker线程内部需要有一个监听函数,监听message事件:

self.addEventListener(‘message‘, function(event){

self.postMessage(‘You said: ‘ + event.data);

}, false);

除了使用self.addEventListener()指定监听函数,还可以使用self.onmessage指定。监听函数的参数是一个事件对象,它的data属性包含主线程发来的数据。self.postMessage()方法用来向主线程发送消息。

Worker同样可以加载其它脚本完成任务(相当于子线程里的子线程),Worker内部如果要加载其他脚本,有一个专门的方法importScripts(),如:

importScripts(‘...script1.js‘);

主线程可以监听Worker是否发生错误(Worker内部也可以监听error事件)。如果发生错误,Worker会触发主线程的error事件:

worker.onerror(function(event){

console.log([‘ERROR: Line ‘, e.lineno, ‘ in ‘, e.filename, ‘: ‘, e.message].join(‘‘));

});

// 或者

worker.addEventListener(‘error‘, function(event){

// ...

});

使用完毕,为了节约资源,需要关闭子线程:

self.close();

附实例代码:

<!-- 主线程部分 -->
    <script>
        //由于 Worker 不能读取本地文件,所以这个脚本必须来自网络
        //var worker = new Worker(‘js/work.js‘);
        var worker =new Worker(‘http://39.96.14.133/web1903_6html5API/js/work.js‘);

        //1.主进程推送给子进程 可以使用对象或者字符串等
        worker.postMessage({method: ‘echo‘, args: [‘Work‘]});
        //worker.postMessage(‘Hello World‘);

        //4.接受子进程过来的数据
        worker.onmessage = function (event) {
            console.log(‘Received message ‘ + event.data);
        }

        //5.使用完毕,为了节省系统资源,必须关闭 Worker
        worker.terminate();
    </script>

<!-- 子线程部分 -->
//2.把数处理后的程序发送给主进程
self.addEventListener(‘message‘, function (e) {
    //3.子进程处理传入的参数
    self.postMessage(‘You said: ‘ + e.data); //e.data 就是传入的数据
}, false);

//work 进程识别主进程的不同处理
// self.addEventListener(‘message‘, function (e) {
//     var data = e.data;
//     switch (data.cmd) {
//       case ‘start‘:
//         self.postMessage(‘WORKER STARTED: ‘ + data.msg);
//         break;
//       case ‘stop‘:
//         self.postMessage(‘WORKER STOPPED: ‘ + data.msg);
//         self.close(); // Terminates the worker.
//         break;
//       default:
//         self.postMessage(‘Unknown command: ‘ + data.msg);
//     };
// }, false);

//5.使用完毕,为了节省系统资源,必须关闭 Worker
self.close();

原文地址:https://www.cnblogs.com/wodeqiyuan/p/11558805.html

时间: 2024-11-14 12:33:35

部分增强Web技术(3)的相关文章

部分增强Web技术(1)

一.Web SQL 数据库 Web SQL是一个独立的规范,引入了一组使用SQL操作客户端数据库的API(应用编程接口).Web SQL数据库可以在最新版的Safari.Chrome和Opera浏览器中工作.可用如下方式判断浏览器是否支持Web SQL: if(window.openDatabase){ console.log(“浏览器支持Web SQL”); } Web SQL规范中定义了三个核心方法: openDatabase:打开现有的数据库或者创建一个数据库对象(新建数据库) trans

部分增强Web技术(2)

二.IndexedDB 1.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据: Cookie的大小不超过4KB,且每次请求都会发送回服务器:LocalStorage在2.5MB到10MB之间(各家浏览器不同),而且不提供搜索功能,不能建立自定义的索引.所以,需要一种新的解决方案,这就是IndexedDB诞生的背景. 通俗地说,IndexedDB就是浏览器提供的本地数据

《转》冯森林:手机淘宝中的那些Web技术(2014年)

Native APP与Web APP的技术融合已经逐渐成为一种趋势,使用标准的Web技术来开发应用中的某些功能,不仅可以降低开发成本,同时还可以方便的进行功能迭代更新.但是如何保证Web APP的流畅性也一直是业内讨论的热点.InfoQ此次专访了手机淘宝客户端高级技术专家冯森林来谈谈手机淘宝在Web技术方面的一些实践经验,另外作为ArchSummit深圳2014大会<移动互联网,一浪高过一浪>专题的讲师,冯森林将会分享 手机淘宝的客户端架构探索之路 . InfoQ:淘宝手机客户端是否使用了HT

JAVA读书推荐----《深入分析Java Web技术内幕》--《java多线程编程核心技术》--《大型网站技术架构 核心原理与案例分析》-《Effective Java中文版》

(1)  首先推荐的不是一本书,而是一个博客,也是我们博客园另外一位博友java_my_life. 目前市面上讲解设计模式的书很多,虽然我前面讲了看书是最好的,但是对设计模式感兴趣的朋友们,我推荐的是这个博客.这位博友的设计模式讲得非常非常好,我认为90%的内容都是没有问题且很值得学习的,其讲解设计模式的大体路线是: 1.随便开篇点明该设计模式的定义 2.图文并茂讲解该设计模式中的结构 3.以详细的代码形式写一下该种设计模式的实现 4.补充内容 5.讲解该设计模式的优缺点 对于一个设计模式我们关

冯森林:手机淘宝中的那些Web技术

Native APP与Web APP的技术融合已经逐渐成为一种趋势,使用标准的Web技术来开发应用中的某些功能,不仅可以降低开发成本,同时还可以方便的进行功能迭代更新.但是如何保证Web APP的流畅性也一直是业内讨论的热点.InfoQ此次专访了手机淘宝客户端高级技术专家冯森林来谈谈手机淘宝在Web技术方面的一些实践经验,另外作为ArchSummit深圳2014大会<移动互联网,一浪高过一浪>专题的讲师,冯森林将会分享手机淘宝的客户端架构探索之路. InfoQ:淘宝手机客户端是否使用了HTML

手机淘宝中的那些Web技术-使用了类似PhoneGap的实现

Native APP与Web APP的技术融合已经逐渐成为一种趋势,使用标准的Web技术来开发应用中的某些功能,不仅可以降低开发成本,同时还可以方便的进行功能迭代更新.但是如何保证Web APP的流畅性也一直是业内讨论的热点.InfoQ此次专访了手机淘宝客户端高级技术专家冯森林来谈谈手机淘宝在Web技术方面的一些实践经验,另外作为ArchSummit深圳2014大会<移动互联网,一浪高过一浪>专题的讲师,冯森林将会分享手机淘宝的客户端架构探索之路. 1.淘宝手机客户端是否使用了HTML5技术?

Web技术持续演进,支付和教育领域探索更多可能

谷歌Chrome浏览器已经发布十年,而浏览器和Web在这十年里实现了快速发展.今天,我们可以使用网页联系朋友.播放电影.直播赛事.预订晚餐.购买咖啡,在家中就可以安逸地购物,规划海外度假行程等.尽管Web在我们生活的各个方面扮演着不可或缺的角色,但我们却很少关注它的工作原理.Web技术未来有着怎样的发展前景?英特尔开源技术中Web技术平台领域的战略规划师Barbara Hochgesang做了详细分析. 一般来说,英特尔战略规划师的工作是试图预测未来一到两年的趋势,理解英特尔处理器及其平台规划,

Java Web技术总结(目录)

来源于:http://www.jianshu.com/p/539bdb7d6cfa Java Web技术经验总结(一) Java Web技术经验总结(二) Java Web技术经验总结(三) Java Web技术经验总结(四) Java Web技术经验总结(五) Java Web技术经验总结(六) Java Web技术经验总结(七) Java Web技术经验总结(八) Java Web技术经验总结(九) Java Web技术经验总结(十) Java Web技术经验总结(十一) 文/杜琪(简书作者

深入分析Java Web技术(1)

BS网络模型的基本过程: 当我们在浏览器中输入"www.google.com"的时候,首先会请求DNS服务器对域名进行解析成都应的IP地址,然后根据这个IP地址在互联网上找到谷歌的服务器,向这个服务器发送一个"get"请求,有这个服务器决定返回数据资源给请求的用户(在服务器端可能还会存在其他复杂的业务逻辑,服务器端有很多机器的话,需要考虑负载均衡,由哪一台服务器对资源进行回复,请求的文件是存储在静态文件中还是存储在分布式缓存中或者是数据库中,当数据返回服务器时,会发