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应用性能研究" HTML5 Web Worker是HTML5提供的一种JavaScript多线程解决方案,可以在Web页面上并发运行多个JavaScript脚本,而不会阻塞用户界面。下面是使用HTML5 Web Worker提高Web...
HTML5 Web Worker是一种JavaScript的多线程解决方案,它允许开发者在后台线程中执行耗时的计算任务,而不会阻塞用户界面。Web Worker的主要目标是改善网页应用的性能,尤其是处理大量数据或进行复杂计算时,使得主线...
1. **Web Worker**:Web Worker是HTML5引入的一种技术,允许在后台线程中运行脚本,这样可以长时间运行的任务不会影响用户界面的响应性。主线程负责处理UI交互,而Worker线程则用于处理计算密集型任务。 2. **Face-...
**H5 Web Worker** 是HTML5中引入的一个重要特性,旨在解决现代Web应用程序中的多线程问题。在传统的Web开发中,JavaScript是单线程执行的,这意味着所有任务都在同一个线程上运行,如果遇到复杂的计算或者长时间的...
Web Worker是HTML5引入的一个特性,用于在后台线程中执行脚本,以实现多线程处理,避免阻塞主线程。由于Web Worker的特殊性,其加载和运行机制与常规的JavaScript代码不同,因此需要特别处理。 为了在Webpack中添加...
Web Worker是HTML5引入的一种特性,它为JavaScript提供了一种在后台线程中运行脚本的能力,从而解决了JavaScript单线程执行模型所带来的问题。在传统的JavaScript执行环境中,所有的任务都在同一个线程上运行,如果...
Web Worker是HTML5的一个特性,它允许在浏览器后台独立于主线程执行脚本,避免了长时间运行的脚本导致的网页无响应问题。Web Worker在后台线程中运行,可以长时间进行大量计算,同时不会影响用户的交互。Worker线程...
将 HTML5 与节点流 API 结合使用 var workerstream = require('workerstream') var worker = workerstream('my-worker.js') worker是一个流,并说出流事件: data 、 error和end 。 这意味着您可以将工作器输出通过...
在"Html5+WebWorkers定时通讯心跳处理"的场景中,我们首先需要创建一个Web Worker脚本,这个脚本通常会包含心跳消息的发送逻辑。例如,worker.js可能包含以下代码: ```javascript self.addEventListener('message'...
Web Worker是HTML5引入的一个特性,它允许在浏览器的后台线程中执行脚本,以进行计算密集型或长时间运行的任务,而不影响用户界面的响应速度。在图像加载场景中,由于图片数据量大,直接在主线程加载会使得页面变得...
【温故而知新】HTML5的Web Worker
HTML5的Web Worker是JavaScript实现多线程的一种技术,它允许开发者在后台线程中运行耗时的操作,而不会影响用户界面的响应性。Web Worker的主要目标是解决JavaScript的单线程执行问题,使得复杂的计算或者大数据...
这个名为"基于各种HTML5新特性、WebSocket、WebWorker实现的视频播放弹幕互动网页.zip"的压缩包文件,显然是一个利用HTML5技术来构建的多媒体互动项目,特别关注了视频播放和实时弹幕功能。 首先,让我们详细了解...
为了解决这个问题,HTML5引入了Web Workers API,它允许在后台线程中执行脚本,从而不阻塞主线程。但Web Workers不能直接访问DOM,这限制了其在处理DOM操作时的应用。`Via.js`,正如标题所言,是一个创新性的库,它...