Java多线程、Linux进程和HTML5 Web Workers有什么区别?Web Workers的实际用例是什么?

3
我是一个新手,学习HTML5 Webworker API。 Web worker是在后台运行的JavaScript,不会影响页面的性能
以下是Webworker API的简单示例。如果我启动Webworker并继续使用其他页面和站点而不停止它,则经过几分钟后,我的浏览器会有更多负载,并且无法正常工作。虽然它在后台运行,但如果我们不停止Webworker,它们将增加并影响性能问题,那么如何表明"不会影响页面的性能"请问有人能够给出关于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个回答

1

Webworkers不会中断UI线程

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

所以,生成更多的线程确实会增加计算机的负载,但同时在Webworker中完成的工作不会中断负责渲染页面的UI线程。

Webworker的限制

Webworkers确实会生成真正的操作系统级别的线程,我们知道Web开发人员不能信任他们自己来正确地处理这个问题,因此API已经被包裹起来,以便我们必须非常努力才能伤害自己。

考虑到这一点:

  • Webworkers无法访问DOM
  • 它们只能通过消息传递进行通信
这限制了它们的实用性,因为您无法在另一个线程中计算DOM片段,并且您正在为所有来回发送的数据添加序列化开销。因此,你最好处理一个 令人尴尬地并行 的问题,否则可能不值得花费这些精力。
在其他语言(如Java、C和其他 并发特定语言)中,通常可以更好地控制线程。大多数主流语言使用 共享内存模型,其中您共享内存并通过互斥、屏障和其他机制控制其访问。当然,如果不小心,也很容易遇到麻烦,因为死锁和其他并发错误更难调试。
一些令人尴尬地并行的问题的例子?
一个令人尴尬地并行的问题是可以轻松分成单独的工作部分而不需要太多通信的问题。
例如:
  • 光线追踪(您可以计算每个像素而不需要知道其他像素的值)
  • 矩阵乘法
  • 暴力搜索

Webworkers是单线程的,这意味着我们同时只能使用一个实例进行工作?对于实时应用程序,我们应该选择Webworkers还是现在采用ajaxify开发比较好? - Ashwin Parmar
1
@AshwinP 你可能更感兴趣的是websockets link2和像firebase这样的服务。我还没有找到除了图形渲染实验之外使用WebWorkers的用途。 - Kerry Liu
谢谢@Kerry Liu。但是如果我们在我的页面上使用多个Web Workers,会对我的系统造成很大的危害,对吗?可能会影响性能。 - Ashwin Parmar
1
@AshwinP 使用 Web Workers,就像使用任何其他线程程序一样,只有在实现不当或恶意的情况下才会“有害”。 - Kerry Liu
不幸的是,不仅“Web Workers 不会中断 UI 线程”,而且 UI 线程也缺乏中断 Worker 的任何机制。参见 https://dev59.com/1FwY5IYBdhLWcg3wup5c#32269593。 - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接