Web Workers现在还只是一个w3c的提案,可能随时都会有更改,但是Firefox, Safari和chrome已经将其加入到自己产品中了。Web Workers为浏览器提供了真正的异步计算的能力,web worker里的代码是执行在OS级别上的线程中的。但是目前并不能指望web worker能强大到什么程度,比如不支持同步机制,执行的时候还是js代码... 尽管如此,web worker还是可以解决诸如计算量庞大导致的UI焊住的问题。
使用web workers#
Mozilla有个不错的介绍,另外w3c的提案本身就带有示例代码,这些都可以参考。下面用具体的代码来展示如何使用web Workers。
1.在html中创建web worker对象。
var worker = new Worker('worker.js');
2.绑定onmessage事件,只有实现了worker的onmessage事件才可以收到worker的通知。
worker.onmessage = function(event){
alert(event.data);
};
3.向worker发布消息让它开始执行。
worker.postMessage('go');
4.在worker的代码中,需要实现onmessage接受外部的消息,当完成计算后,用postMessage通知外部。
onmessage = function(event){
if(event.data == 'go'){
postMessage('worker done!');
}
}
5.worker里面还可以生成子worker(subworker):
//work.js:
var subworker = new Worker('subworker.js');
subworker.onmessage = function(e){
postMessage(e.data.msg)
}
//subWork.js:
postMessage({
msg: 'sub worker done'
});
SharedWorker#
chrome和safari支持sharedWorker,可以共享worker里面的数据。
html中:
//创建SharedWorker对象
var sharedworker = new SharedWorker('sharedWorker.js');
sharedworker.port.onmessage = function(e) { // note: not worker.onmessage!
writeLog(e.data);
}
//sharedWorker还可以用addEventListener去绑定worker的通知事件
sharedworker.port.addEventListener('message', function(e) {writeLog('listend:'+e.data);},false);
function testSharedWorker(){
sharedworker.port.start(); // note: need this when using addEventListener
sharedworker.port.postMessage('ping');
}
sharedWorker.js中:
var count=0;
//每次创建shared worker会触发onconnect事件
onconnect = function(e) {
var port = e.ports[0];
count++;
port.postMessage('Hello World! '+count);
port.onmessage = function(e) {
port.postMessage('pong'); // not e.ports[0].postMessage!
}
}
在附件的demo中,用iframe引入了另一个html(当然这个html是在同一个domain下的),在这个html再使用同一个shared worker。可以看出shared worker为两个外部调用共享了数据count。
innerTest.htm:
var sharedworker = new SharedWorker('sharedWorker.js');
sharedworker.port.postMessage();
查看附件
一些重要的问题#
- 所有版本的IE都不支持web worker.
- worker中的属性不能被父页面访问,worker也不能访问父页面的DOM节点,worker只能通过消息事件与外部通讯
- Chrome和Safari不支持sub worker,Firefox不支持shared worker
- 可以在worker中使用setTimeout、setInterval
- 别太指望web worker的性能,如果web worker运行中不断的抛出事件让父页面更新DOM,浏览器照样焊住。
分享到:
相关推荐
使用HTML5 Web Worker提高Web的应用性能研究.pdf
在HTML5中提出了工作线程(WebWorker)的概念,并且规范出WebWorker的三大主要特征:能够长时间运行(响应),理想的启动性能以及理想的内存消耗。WebWorker允许开发人员编写能够长时间运行而不被用户所中断的后台...
至2008年W3C制定出第一个HTML5草案开始,HTML5 承载了越来越多崭新的特性和功能。...Worker)的概念,并且规范出WebWorker的三大主要特征:能够长时间运行(响应),理想的启动性能以及理想的内存消耗。Web
主要介绍了浅谈HTML5 Web Worker的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
将 HTML5 与节点流 API 结合使用 var workerstream = require('workerstream') var worker = workerstream('my-worker.js') worker是一个流,并说出流事件: data 、 error和end 。 这意味着您可以将工作器输出通过...
HTML5 js后台实现多线程 克服js单线程导致页面卡死情况
画布WebWorker 可以在WebWorkers中使用的纯JavaScript Canvas实现 当必须执行长脚本而主程序必须保持运行(不能被阻止)时,WebWorkers非常有用。 当必须生成复杂的图像(例如,游戏的纹理较大)时,该生成可能会...
主要介绍了针对HTML5的Web Worker使用攻略,特别是结合worker拿手的JS使用起来十分有效,需要的朋友可以参考下
一个由WebWorker驱动的Minesweeper游戏,以JavaScript,HTML和CSS编写。 是的,仅将webworkers用于minesweepr可能会过大,但因为在2013年左右首次编写时,至少在Firefox中确实产生了明显的变化。 但是,了解它们...
网络工作者图加载使用Web Worker加载图像这有什么意义呢?浏览器不是已经在单独的线程中对图像进行解码了吗?浏览器分别对图像进行解码,是的,但是不会分别加载图像。在下载图像时,它们阻塞了UI线程并阻止了其他...
html5中Webworkers的工作原理
这节我们来探讨一下多线程 Web-Worker。 一、明确 JavaScript 是单线程 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 听起来有些匪夷所思,为什么不设计成多线程提高效率呢?我们可以...
Html5+WebWorkers定时通讯心跳处理
html5 web workers的作用及使用场景.docx
Quickbase Web Workers Quickbase的javascript SDK很方便,但是可以在主UI线程上运行。 这会使您可能创建的任何代码页陷入困境,尤其是在涉及大数据时。...| - webworker.js | - yourCustomCodePage.js
2.9. Web Worker API 15 2.10. Webstorage 16 2.11. 离线应用 19 2.12. applicationCache API 21 2.13. HTML5 File 22 2.14. 链接预取功能 22 第三章 现有HTML5的应用 23 第四章 HTML5扩展 24 Kaltura HTML5 25 ...