`
film
  • 浏览: 231455 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WEB Workers提升WEB前端脚本JavaScript的处理性能

 
阅读更多

WEB Workers提升WEB前端脚本JavaScript的处理性能
原文地址: http://blog.mozbox.org/post/2009/04/10/Web-Workers-in-action



你有没有想过在运行大型复杂的JavaScript脚本的时候不会发生浏览器假死

你有没有想过JavaScript可以在后台运行?

你有没有想过JavaScript函数甚至可以在多个进程中同时运行?


不可能?当你看完本文,也许会让你感觉很兴奋!


什么是Web Workers?

Web WorkersWEB前端网页上的脚本提供了一种能在后台进程中运行的方法。一旦它被创建,Web Workers就可以通过postMessage()向任务池发送任务请求,执行完之后再通过postMessage()返回消息给创建者指定的事件处理程序(通过onmessage进行捕获)。

Web Workers进程能够在不影响用户界面的情况下处理任务,并且,它还可以使用XMLHttpRequest来处理I/O,无论responseXML和channel属性是否为null。

注意:通常,后台进程(包括web workers进程)不能对DOM进行操作。如果希望后台程序处理的结果能够改变DOM,只能通过返回消息给创建者的回调函数进行处理。


浏览器支持:

FireFox3.5(Firefox 3.1 support for DOM workers)
Safari4
支持html5的浏览器


进程安全

Workers接口可以创建真正的系统级别的进程,如果你不小心的话,你的代码很容易引起并发操作效果,这将会很有趣。


在Mozilla下,Workser并发操作常发生在:

1、在做网站下载的时候使用Worker。

2、使用Worker实现处理扩展功能。

创建一个Worker

我们可以很简单地创建一个worker,只要调用Worker(URI)构造函数即可。参数URI,要执行的脚本文件地址。
如果你想获取worker进程的返回值,可以通过它的onmessage属性来绑定一个事件处理程序,如:

var myWorker = new Worker('easyui.js');
myWorker.onmessage = function(event){
alert('Called back by the worker!');
};

第一行用来创建和运行worker进程,第二行设置worker的onmessage属性用来绑定指定的事件处理程序,当worker私有的postMessage()方法被调用时,这个被绑定的程序就会被触发。


创建一个subworkers

如果原意,你可以创建多个workers。subworkers必须寄宿于同一个父页面下,并且,它的URI必须与parent worker的地址同源。这样可以很好的维持它们的依赖关系。


Timeouts 和 intervals

Workers可以使用timeouts和intervals。这很有用,例如,如果你想让你的worker进程周期性地运行而不是不停的循环下去的话,你就可以使用了。

参见:setTimeout(),clearTimeout(),setInterval(),clearInterval()


终止 worker

如果你需要马上终止一个正在运行中的worker,你可以调用它的terminate()方法:

myWorker.terminate();

这样,一个worker进程就被结束了。


错误捕获 Handling errors

当worker发生运行时错误时,它的onerror事件就会被触发。该事件接收一个error的事件,该事件不会冒泡,并且可以取消。要取消该事件可以使用preventDefault()方法。

此错误事件有3个属性:

message:可读的错误信息

filename:发生错误的脚本文件名称

lineno:发生错误的脚本所在文件的行数


访问navigator对象

Workers可以访问navigator对象,它包含下面可以用来标示浏览器的字符:

appName

appVersion

platform

userAgent


导入脚本和库

Worker进程可以访问全局函数importScripts(),该方法可以将脚本或库导入到它们的作用域中。

此方法可以接受空的参数或多个脚本URI参数,下面这些形式都是合法的:

importScripts();/* imports nothing */
importScripts('foo.js');/* import just "foo.js" */
importScripts('foo.js','bar.js');/* imports two scripts */

Firefox会加载列出的每一个脚本文件,然后运行并初始化。这些脚本中的任何全局对象都可以被worker使用。

注意:脚本下载可能顺序不一样,但,执行的顺序一定是按importScripts中列出的顺序进行,而且是同步的,在所有脚本加载完并运行结束后importScripts才会返回。


演示

这部分,我们将演示如何使用DOM Workers.


在后台执行指令

Workers的一个很有用的方法就是使得你的代码可以在后台运行,而不影响用户界面。下面,我们来演示一下使用worker进行Fibonacci数列的计算。

JavaScript代码:

下面的Javascript代码保存到 fibonacci.js 文件

JScript code

var results = [];

var resultReceiver = function(event){

results.push(parseInt(event.data,10));

if(results.length==2){

postMessage(results[0]+results[1]);

}

};

var errorReceiver = function(event){

throw event.data;

};

var onmessage = function(event){

var n = parseInt(event.data,10);

if(n==0||n==1){

postMessage(n);

return;

}

for(var i=0;i<=2;i++){

var worker = new Worker("fibonacci.js");

worker.onmessage = resultReceiver;

worker.onerror = errorReceiver;

worker.postMessage(n-i);

}

};



onmessage函数在worker调用postMessage()时被触发,这时便开始递归。在里边创建新的worker拷贝对每次的计算结果进行迭代。

HTML代码

HTML code

<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML4.0 Transitional//EN">

<html>

<head>

<title>Test threads fibonacci</title>

</head>

<body>

<div id="result">http://www.v-ec.com/dh20156/article.asp?id=242</div>

<script type="text/javascript">

var worker = new Worker("fibonacci.js");

worker.onmessage = function(event){

document.getElementById('result').innerHTML = event.data;

dump('Got:'+event.data+'/n');

};

worker.onerror = function(event){

dump('Worker error:'+error.message+'/n');

throw error;

};

worker.postMessage('5');

</script>

</body>

</html>



在页面中创建了一个ID为result的DIV用来显示计算结果,然后创建worker,设置onmessage事件用来显示计算结果到result,设置onerrer事件用来设置dump错误信息。
最后,发送“5”到worker,开始计算。


在后台操作 WEB I/O

你可以在此查看到一篇关于Using workers in extensions的文章。


在多个workers进程中处理任务

随着多核计算机的普及,在多进程处理复杂的任务也越来越被更多的人使用,在多个workers进程中处理任务的演示不久将会提供给大家。


在workers中创建workers

前面Fibonacci例子的演示中我们看到,在workers中可以创建其他的workers,这使得递归很容易进行。


发送对象给workers

你可以通过postMessage()方法安全地将对象传递到workers或者从中返回对象;这些对象将被自动转换为JSON格式。

var onmessage = function(e){
postMessage(e.data);
};

注意:在workers中进出的对象不能包含函数和循环引用,因为JSON不支持它们。

See also参见:

WebWorkers

Worker

WorkerGlobalScope

SharedWorker

Web Workers specification

转载请注明出处:http://www.v-ec.com/dh20156/article.asp?id=242

经过WEB前端DHTML精英俱乐部测试发现,Safari4已经可以支持Web Workers,不过貌似还不支持在worker中创建worker,所以,本文中上面的Fibonacci例子测试失败,WEB前端DHTML精英俱乐部重新写了一个实例进行演示:
WEB前端专家DHTML精英俱乐部对Web Workers进行的性能测试!


Firefox 3.5 其中一个最大的特性就是对worker的支持(当然safari也支持)。workers不仅仅能够让我们未来的web APP更加MVC。同时,他的异步后端运算给web程序带来更多可能性。

到底有什么好处?来看实例更加直接一些.mozbox的Paul Rouget用模拟退火算法(Simulated annealing)给我们演示了workers的优越性。

1.不了解 Simulated annealing 的可以先看看这个图形化的演示过程,了解的同学直接看第二步

http://people.mozilla.com/~prouget/demos/simulatedAnnealing/index.xhtml

先load,然后start

2.确定一下,您有没有安装firefox 3.5 beta3

3.看看worker的演示吧.

http://people.mozilla.com/~prouget/demos/worker_and_simulatedannealing/index.xhtml

可以看到如果没有使用workers,同时计算6个Simulated annealing,可以发现浏览器已经卡死,gif图片也停止播放。

当我们开启workers的演示后,浏览器不仅仅没有卡死,同时gif图片也正常播放,并且结果的现实比没有开启workers前快不少。

分享到:
评论

相关推荐

    Html5+WebWorkers定时通讯心跳处理

    在"Html5+WebWorkers定时通讯心跳处理"的场景中,我们首先需要创建一个Web Worker脚本,这个脚本通常会包含心跳消息的发送逻辑。例如,worker.js可能包含以下代码: ```javascript self.addEventListener('message'...

    JavaScript开发使用WebWorkers

    总结,Web Workers是提升JavaScript性能的关键技术,尤其在处理大数据和复杂计算时。结合Jest和JSDOM的扩展,开发者可以有效地测试和验证Web Workers相关的代码,确保其在各种环境下的正确性和稳定性。理解并熟练...

    Web 前端性能优化思路与学习方法

    Web前端性能优化是提升网页用户体验和确保网站成功的关键因素之一。性能优化涉及多个方面,包括但不限于代码优化、资源加载策略、服务器配置等。本篇内容将深入探讨Web前端性能优化的思路与学习方法,结合WebQQ、QQ...

    vueworker以一种简单的方式使用webworkers的Vue插件

    `vue-worker` 插件简化了在 Vue.js 应用中集成 Web Workers 的过程,通过提供 Vue 风格的 API,使开发者能更好地利用 Web Workers 来提升应用性能,同时避免了数据同步和资源管理的问题。在处理大数据处理、图像渲染...

    HTML5 Web Workers之网站也能多线程的实现

    传统的做法可能会让整个页面卡死,而通过Web Workers可以将文件处理逻辑放在后台线程执行,主线程则负责接收处理进度和结果,这样既保证了操作的流畅性,也提高了应用的性能表现。 总的来说,Web Workers是HTML5中...

    Web前端开发技术(第2版)储久良课后实验材料及源代码

    在《Web前端开发技术(第2版)》中,储教授会详细介绍HTML5的新特性,如语义化标签(如、、等)、离线存储(Application Cache)、音频/视频处理(、标签)、Canvas画布、SVG矢量图、Web Workers和Web Storage等,...

    PPT关于WEB性能

    1. **前端优化**:前端优化是提升Web性能的关键,包括代码压缩(JS、CSS、HTML)、图片优化、减少HTTP请求数量、利用CDN(内容分发网络)和启用HTTP/2等策略。 2. **JavaScript阻塞**: - **异步加载**:为了避免...

    Vue.js中使用Web Workers来创建一个秒表

    在Vue.js中,Web Workers是一种优化应用性能的技术,它可以让你在后台线程中处理计算密集型任务,从而避免阻塞主线程(UI渲染线程)。本文将深入探讨如何在Vue项目中利用Web Workers来创建一个秒表功能。 首先,...

    1500个前端开发常用JavaScript特效.rar

    14. **Web Workers**:在后台线程中运行脚本,避免阻塞主线程,提高性能。 15. **WebSocket**:创建持久连接,实现实时通信,如聊天应用。 这个压缩包中的".chm"文件是Windows的帮助文件,里面应该包含了这些特效...

    前端性能优化原理与实践.zip

    在前端开发领域,性能...以上这些方法都是前端性能优化的关键点,通过综合运用这些策略,可以显著提升Web应用的性能,提供更优秀的用户体验。在实践中,开发者需要根据项目具体需求和用户行为数据进行有针对性的优化。

    1+X Web前端中级样题加知识点整理.zip

    Web前端技术是现代互联网开发的重要组成部分,主要负责构建和维护用户在浏览器中看到和交互的网站界面。"1+X Web前端中级样题加知识点整理.zip" 是一个针对Web前端中级水平考试的备考资料包,它包含了样题和相关知识...

    WEB前端技术笔记整理

    此外,Web Workers和WebGL等技术也提升了网页的性能和交互体验。 总的来说,这五种技术是构建现代网页不可或缺的部分。学习并熟练掌握它们,将有助于你成为一位优秀的前端开发者。通过不断实践和学习新的前端框架,...

    web前端黑客技术揭秘(全)_part1

    根据文件信息,这篇文章的主题集中在web前端黑客技术上,特别是涉及到了跨站脚本攻击(XSS)和HTML5相关的技术。由于这部分内容中没有提供具体的文本内容,无法分析具体的知识点。但是,我可以基于提供的标题、描述...

    前端大数据导入,异步处理

    为了优化性能,可以考虑使用Web Workers,这是一个在后台线程中运行脚本的机制,可以避免因为数据处理而阻塞主线程。 后端接收到前端发送的数据后,通常会将其存储到数据库或者进行进一步的分析计算。为了处理大量...

    用Javascript搭建企业级web应用

    总的来说,Javascript作为企业级Web应用的开发语言,不仅可以提供高性能的前端交互体验,还能胜任后台逻辑的处理。结合现代化的开发工具和框架,Javascript已经成为了构建大规模、高性能Web应用的重要选择。随着技术...

    前端性能优化:掌握解决方案.zip

    在前端开发领域,性能优化是提升用户体验和网站可访问性的重要环节。本资源"前端性能优化:掌握解决方案.zip"提供了一种系统性学习和实践前端性能优化的方法。下面,我们将详细探讨这个主题,涵盖多个关键知识点。 ...

    web前端基础入门教程之HTML5 Web Workers

    HTML5 Web Workers是前端开发中的一个重要特性,它允许在后台线程中运行JavaScript代码,从而在不影响用户界面性能的情况下处理耗时的任务。Web Workers的主要目标是解决JavaScript的单线程执行问题,使得复杂的计算...

    内存javascript脚本

    根据提供的文件信息,我们可以深入探讨与“内存JavaScript脚本”相关的知识点。这将涵盖JavaScript在内存管理中的作用、常见的内存问题及其解决方案。 ### 内存管理基础 在计算机科学中,内存是用于存储数据和程序...

    Javscript高性能编程+Javascript异步编程

    JavaScript是一种广泛应用于Web开发的脚本语言,它在前端交互、后端开发以及移动应用等领域都有广泛应用。"JavaScript高性能编程"和"JavaScript异步编程"是两个关键的JavaScript专题,对于提升应用程序的性能和用户...

    JavaScript实例应用 JavaScript实例应用

    11. **Web Workers**:JavaScript的Web Workers特性可以开启后台线程,处理大量计算任务,避免阻塞用户界面。 12. **Service Worker**:服务工作者是现代Web开发中的一个重要组成部分,它可以离线存储资源,实现...

Global site tag (gtag.js) - Google Analytics