Java MultiThreading,Linux Processes和HTML5 Webworkers之间有什么不同? Webworkers和使用的实际例子是什么?

时间:2013-10-01 13:41:59

标签: java javascript multithreading performance web-worker

我是HTML5 Webworker API的新手。 网络工作者是在后台运行的JavaScript,,不会影响网页的效果

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

任何人都可以在网络上给出正确的示例或消息以供实际使用吗?我们可以将网络工作者与Java多线程和Linux进程进行比较吗?

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();

1 个答案:

答案 0 :(得分:1)

Webworkers不会中断UI线程

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

因此,产生更多线程会产生更多负载,但同时在webworker中完成的工作不会中断负责呈现页面的UI线程。

网络工作者限制

Webworkers确实产生了真正的操作系统级线程,而且正如我们所知,Web开发人员无法信任正确处理这一问题,所以API已被冒泡包装,因此我们必须非常努力地伤害自己。

考虑到这一点:

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

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

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

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

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

例如:

  • Raytracer(您可以在不知道其他像素值的情况下计算每个像素)
  • Matrix Multiplication
  • 强力搜索