4

我是 HTML5 Webworker API 的新手。Web Worker 是在后台运行的 JavaScript,不会影响页面的性能

下面给出了 Webworker API 的简单示例。如果我启动 Webworker 并且不停止使用其他页面和站点。几分钟后,我的浏览器将有更多的负载和使用浏览器的问题。它在后台运行,但如果我们不停止 Webworker,它们会增加并影响性能问题,所以我怎么能说“不影响页面的性能”

任何人都可以为实际使用的网络工作提供适当的示例或建议吗?我们可以将网络工作人员与 Java 多线程和 Linux 进程进行比较吗?

演示.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();
4

1 回答 1

1

Webworkers 不会中断 UI 线程

javascript 中的 Webworkers 使我们能够生成新线程。在大多数浏览器实现中,javascript 是单线程的。它与负责重排和重绘页面的 UI 线程共享执行时间。如果您执行通常需要很长时间才能处理的 javascript,您可以轻松地使您的页面无响应,因为它将忙于执行您告诉它执行的任何操作,而不是处理用户事件和重新绘制页面。我们可以通过多种方式解决此问题(setTimeout 或工作队列),但如果您尝试计算正确类型的数据,我们也可以使用 webworkers。

所以,是的,产生更多线程会给您的计算机增加更多负载,但同时在 webworker 中完成的工作不会中断负责呈现页面的 UI 线程。

网络工作者限制

Webworkers 确实产生了真正的操作系统级线程,而且我们知道 Web 开发人员不能被信任来正确处理这个问题,所以 API 已经被冒泡包装了,所以我们不得不非常努力地伤害自己。

考虑到这一点:

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

这限制了它们的实用性,因为您无法在另一个线程中计算 DOM 片段,并且您正在为来回发送的所有数据添加序列化开销。所以你最好处理一个令人尴尬的并行问题,否则可能不值得付出努力。

在其他语言(如 Java、C 和其他特定于并发的语言)中,通常可以更好地控制线程。大多数主流语言都使用共享内存模型,您可以在其中共享内存并通过互斥锁、屏障和其他机制控制其访问。当然,如果你不小心,你也很容易陷入麻烦,因为死锁和其他并发错误更难调试。

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

一个令人尴尬的并行问题可以很容易地分成不需要太多沟通的独立工作。

例如:

  • Raytracer(您可以在不知道其他像素值的情况下计算每个像素)
  • 矩阵乘法
  • 蛮力搜索
于 2013-10-01T15:41:35.713 回答