HTML5之 WebWorkers

时间:2023-03-10 00:33:33
HTML5之 WebWorkers

为了进行后台计算提供的完全隔离计算方式
不可访问 DOM APIs
不可访问 window object
不可访问 document object
强隔离保证并行计算结果无误(无锁机制)

---- 启动

定义Worker对象
var w = new Worker("calc.js");
Worker会占用比非Worker模式更多内存
硬件好,效率高

---- 通信

Message事件用于和调用方通信
addEventListener('message',function(evt){});

postMessage()用于向Worker发消息
w.postMessage(imgData);

数据会被格式化成为JSON格式
每次发送都是源对象的copy,对象大,性能降低明显

---- Worker 可访问接口

SetTimeout()/clearTimeout()
setInterval()/clearInterval()
importScripts()引入其它JS文件
可以读取url
可以发送xmlhttprequest
Shared worker 共享数据

---- 算闰年的示例

1. HTML 设计

<form name="stepForm">
选择速度:
<select name="step">
<option value="1">1 sec</option>
<option selected="" value="10">10 sec</option>
<option value="60">1 min</option>
<option value="120">2 min</option>
</select> <p>Jahr-Monat: <span id="y">0</span></p>
<input id="start" type="button" onclick="startCalc();" value="Start">
<input id="stop" type="button" onclick="stopCalc();" value="Stop">
<pre id="cnt"></pre>
</form>

2. JS的 设计

window.onload = function() {
var opts = document.forms.stepForm.step.options;
// 开始事件
startCalc = function() {
var step = opts[opts.selectedIndex].value;
var w = new Worker('date_worker.js'); // 创建 Worker 对象
// 发数据到woker
w.postMessage(step);
$("start").disabled = 'disabled'; // 返回数据触发事件
w.onmessage = function(evt) {
if (evt.data.substr(0,2) == "y ") {
$("y").innerHTML = evt.data.substr(2);
} else {
$("cnt").innerHTML += "Schaltjahr: "+evt.data+"\n";
}
}
// 服务停止事件
stopCalc = function() {
w.terminate(); // 中断连接
$("start").removeAttribute("disabled");
}
}
}

3. date_worker.js 设计

addEventListener('message', function(evt) {
var today = new Date();
var oldMonth = -1;
// evt.data 即传进来的参数
for (var i=0; i<today; i+=Number(evt.data)*1000) {
var d = new Date(i);
if (d.getDate() == 29 && d.getMonth() == 1
&& d.getHours() == 12 && d.getMinutes() == 0) {
// 返回数据
postMessage(d.toLocaleString());
}
if (d.getMonth() != oldMonth) {
// 返回数据
postMessage("y "+d.getFullYear()+"-" +(d.getMonth()+1));
oldMonth = d.getMonth();
}
}
}, false);