我是HTML5 Webworker API的新手。
Web worker是在后台中运行的JavaScript,而不会影响页面的性能。
下面给出的是Webworker API的简单示例。
如果我启动Webworker并且不停止使用其他页面和站点。几分钟后,我的浏览器将负担更多,并且无法使用浏览器。
它在后台运行,但是如果我们不停止Webworker,它们将增加并影响性能问题,因此,如何声明“不影响页面性能” 。
任何人都可以在实际使用中提供有关Webwork的适当示例或建议,我们可以将Webworker与Java Multithreading和Linux Process进行比较吗?
demo.html
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
var w;
function startWorker() {
if(typeof(Worker)!=="undefined") {
if(typeof(w)=="undefined") {
w=new Worker("demo_workers.js");
}
w.onmessage = function (event) {
document.getElementById("result").innerHTML=event.data;
};
} else {
document.getElementById("result").innerHTML="Sorry, your browser does not support Web Workers...";
}
}
function stopWorker() {
w.terminate();
}
</script>
</body>
</html>
demo_workers.js
var i=0;
function timedCount() {
i=i+1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();
最佳答案
Webworkers不会中断UI线程
javascript中的Webworkers使我们能够产生新线程。在大多数浏览器实现中,javascript是单线程的。它与负责重排和重画页面的UI线程共享执行时间。如果您执行的JavaScript通常需要花费很长时间才能处理,则可以轻松地使页面无响应,因为它会忙于按照您的指示执行操作,而不是处理用户事件并重新绘制页面。我们可以通过多种方式(setTimeout或工作队列)解决此问题,但是如果您要计算正确的数据种类,我们也可以使用webworkers。
因此,是的,产生更多的线程将为您的计算机增加更多的负载,但是同时在Webworker中完成的工作不会中断负责呈现页面的UI线程。
Webworker的限制
Webworkers确实产生了真正的OS级线程,并且我们知道Web开发人员无法正确处理此线程,因此该API已被大量包装,因此我们必须非常努力地伤害自己。
考虑到这一点:
这限制了它们的用处,因为您无法在另一个线程中计算DOM片段,并且正在为来回发送的所有数据增加序列化开销。因此,您最好解决embarrassingly parallel问题,否则可能不值得付出努力。
在Java,C和其他concurrency specific languages等其他语言中,通常可以更好地控制线程。大多数主流语言都使用shared memory model,您可以在其中共享内存并通过互斥体,屏障和其他机制控制对它的访问。当然,如果您不小心,也很容易遇到麻烦,因为死锁和其他并发性bug较难调试。
一些令人尴尬的并行问题的例子吗?
令人尴尬的并行问题是,可以轻松地将其分解为不需要大量沟通的独立工作。
例如: