我是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已被大量包装,因此我们必须非常努力地伤害自己。

考虑到这一点:

  • Webworkers无权访问DOM
  • 他们只能通过传递消息的方式进行通信

  • 这限制了它们的用处,因为您无法在另一个线程中计算DOM片段,并且正在为来回发送的所有数据增加序列化开销。因此,您最好解决embarrassingly parallel问题,否则可能不值得付出努力。

    在Java,C和其他concurrency specific languages等其他语言中,通常可以更好地控制线程。大多数主流语言都使用shared memory model,您可以在其中共享内存并通过互斥体,屏障和其他机制控制对它的访问。当然,如果您不小心,也很容易遇到麻烦,因为死锁和其他并发性bug较难调试。

    一些令人尴尬的并行问题的例子吗?

    令人尴尬的并行问题是,可以轻松地将其分解为不需要大量沟通的独立工作。

    例如:
  • Raytracer(您可以在不知道其他像素值的情况下计算每个像素)
  • 矩阵乘法
  • 蛮力搜索
  • 09-13 10:40