Javascript专用Web工作者按需发送消息

时间:2013-06-17 10:26:52

标签: javascript html5 web-worker

是否可以编写一个简单的专用Web工作者,以便它连续处理某些内容并仅在客户端询问时发送其状态。

我到目前为止所做的,客户档案:

<script>
    // spawn a worker
    var worker = new Worker('basic-worker.js');
    // decide what to do when the worker sends us a message
    worker.onmessage = function(e){
        document.getElementById('result').textContent = e.data;
    };
</script>
<html>
<head></head>
<body>
    <p>The Highest prime number discovered so far : <outpout id="result"></output></p>
</body>
</html>

工人档案:

var n = 0;
search: while (true) {
    n += 1;
    for (var i = 2; i <= Math.sqrt(n); i += 1)
        if (n % i == 0)
        continue search;
    // found a prime !
    postMessage(n);
}

正如你所看到的那样,工人不断发送它所发现的素数。我希望能够启动主要计算并要求工作人员在我单击客户端上的按钮时发送他创建的最新素数。这就像是(我知道它不能起作用,只是为了大致了解我想要的东西):

工人档案:

var n = 0;
var lPrime = 0;
// post last prime number when receiving a message
onmessage = function(e) {
    postMessage(lPrime);
}
// continously search for prime numbers
search: while (true) {
    n += 1;
    for (var i = 2; i <= Math.sqrt(n); i += 1)
        if (n % i == 0)
        continue search;
    // found a prime !
    //postMessage(n);
    lPrime = n;
}

客户档案:

<script>
    // spawn a worker 
    var worker = new Worker('basic-worker.js');
    // what to do when the worker sends us a message
    worker.onmessage = function(e){
        document.getElementById('result').textContent = e.data;
    };
    // post to the worker so the worker sends us the latest prime found
    function askPrime(){
        worker.postMessage();
    };
</script>
<html>
<head></head>
<body>
    <p>The Highest prime number discovered so far : <outpout id="result"></output></p>
    <input type="button" onclick="askPrime();">
</body>
</html>

1 个答案:

答案 0 :(得分:8)

这不是一个好的模式。工人是单线程的,因此在任何特定时刻,他们都可以:

  1. 执行计算,

  2. 发送活动,或

  3. 回应活动。

  4. 当您的工作人员正在计算时,它无法响应事件。当您发送最新质数的请求时,您必须等待工作人员完成其正在执行的操作,然后才能处理您的请求。当然,您可以使用setTimeout(或其他方法)来允许浏览器“中断”当前的工作(请参阅Javascript - how to avoid blocking the browser while doing heavy work?),但工作人员的整点是为了避免诉诸这种不必要的复杂性。

    更好的模式是一个非工作变量,它保存最新的素数,并且只要找到新的素数就会由工人更新。您可以在需要最新质数时查询该变量,并且您无需等待工作人员处理您的请求。

    // spawn a worker 
    var worker = new Worker('basic-worker.js');
    
    // store the latest prime as it is produced
    var latestPrime = 1;
    worker.onmessage = function(e){
        latestPrime = e.data;
    };
    
    // fetch the latest prime from the variable
    function askPrime(){
        document.getElementById('result').textContent = latestPrime;
    };
    

    您还可以通过两个工作人员来完成此模式:

    1. 主脚本产生一个拥有最新已知素数的工作者。

    2. 该工作人员会产生第二名工人,该工人实际完成工作,并在发现第一名工人时向其报告新的素数。

    3. 这样,第一个工作人员不做任何工作,并且总是可以自由地响应最新的素数,而第二个工人永远不需要停止计算来响应请求。