有人可以解释webworker线程的例子吗?

时间:2014-01-03 22:25:30

标签: node.js web-worker

var Worker = require('webworker-threads').Worker;
require('http').createServer(function (req,res) {
  var fibo = new Worker(function() {
    function fibo (n) {
      return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
    }

    // which onmessage does this this refer to?
    onmessage = function (event) {  //reference 1
      postMessage(fibo(event.data));
    }
  });
  fibo.onmessage = function (event) { //reference 2
    res.end('fib(40) = ' + event.data);
  };
  fibo.postMessage(40);
}).listen(port);

这是作为webworker类的示例找到的代码。

我正在查看API并且似乎无法理解上面代码中的引用1是指什么。为什么postMessage(40)命中内部onmessage函数而不是fibo.onmessage函数?

3 个答案:

答案 0 :(得分:4)

这里要注意的要点是onmessage()和postmessage()用作主线程和工作线程之间的消息承载。这最初可能会令人困惑。所以流程就像这样

  1. 创建工作线程。

    var fibo= new Worker...

  2. 这将在节点中产生另一个JavaScript线程。它可以在后台并行运行并使用所有可用的CPU内核。否则在节点中由于其单线程模型,不可能利用多个CPU内核(因此工作线程是处理节点中CPU绑定任务的好方法)

    1. 在我们定义的工作线程中 a)如何处理它收到的请求/工作 - onmessage()完成这项工作。它会监听任何传入的工作请求并对其采取行动。
    2. onmessage= function (event) { //reference 1 postMessage(fibo(event.data)); }

      b)完成工作后如何与主线程沟通 -  postMessage完成这项工作。

      postMessage(fibo(event.data));
      
      1. 在主线程中: - 一个。调用工作线程并为其执行任务以执行-ie。使用postmessage(现在你有舞蹈)

        fibo.postMessage(40);

      2. 湾在工作线程完成作业并响应后,定义有关要执行的操作的侦听器。即。使用onmessage。

        fibo.onmessage = function (event) { //reference 2
        res.end('fib(40) = ' + event.data);
        

        };

答案 1 :(得分:0)

试试这段代码:

var port=8080;
var Worker = require('webworker-threads').Worker;
var fibo = new Worker(function() {
function fibo (n) {
    return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}

// which onmessage does this this refer to?
onmessage = function (event) {  //reference 1
    console.log("fibo.onmessage inside");
    postMessage(fibo(event.data));
}
});
fibo.onmessage = function (event) { //reference 2
console.log("fibo.onmessage outside")
console.log('fib(40) = ' + event.data);
};
fibo.postMessage(40);

它给出了

fibo.onmessage inside
fibo.onmessage outside
fib(40) = 165580141

答案 2 :(得分:0)

关键是,它必须在另一个节点上运行,所以这意味着它在某些时候,它正在做(甚至不接近但仍然适用)


    class worker {
        constructor(fnToRun){
            child_process.spawn('thread-creator-process', [
                '-fn', escape(fnToRun.toString())
            ]);
        }
    }

所以现在另一个家伙可以做点像


    var result = new Function('context', 
    'with(context){'+
    '  ' + fnAsString + 
    '}'

result(thisThreadContext);

现在上下文有onmessage引用它将被创建,并且它已经可以引用postMessage和那些东西,通过一点点解析你有一个新的线程可以使用

至少我是这么认为的