使用webworker-threads在Node.js中进行并发

时间:2014-04-08 11:48:00

标签: multithreading node.js concurrency web-worker

这个问题与webworker-threads node.js module有关。

webworker-threads模块的文档非常有限,我找不到任何有关如何实现目标的新的友好示例。

简单地说,我有两个CPU密集型功能需要同时运行,必须返回结果并在完成后立即打印。因为这些同步方法是阻塞的,我现在的模型是这样的:

enter image description here

我想要实现的目标是:

enter image description here

但是我不是专家,我无法理解将webmeer-threads模块的Readme.md中提供的信息转换成我自己的情况。

我目前的黑客工作代码是这样的:

var Worker = require('webworker-threads').Worker;

//console.time("worker1");
var worker = new Worker(function(){
  onmessage = function(event) {
    postMessage(event.data);
    self.close();
  };
});
worker.onmessage = function(event) {
  console.log("Worker1 said : " + event.data);
};
worker.postMessage(work());
//console.timeEnd("worker1")

//console.time("worker2");
var worker2 = new Worker(function(){
  onmessage = function(event) {
    postMessage(event.data);
    self.close();
  };
});
worker2.onmessage = function(event) {
  console.log("Worker2 said : " + event.data);
};
worker2.postMessage(work2());
//console.timeEnd("worker2")

function work(){
    var total = 0;
    for (var i=0; i<430046534; i++){
        total += (i*i*i);
    }
    return total;
}

function work2(){
    var total = 0;
    for (var i=0; i<630746533; i++){
        total += (i*i*i);
    }
    return total;
}

但是,结果只会在第二个工作人员完成时打印到控制台,我甚至不确定我是否正确使用这个模块。

1 个答案:

答案 0 :(得分:2)

您将工作职能的结果发布给工作人员。将该函数放入Web worker中,然后在onmessage期间调用它。

&#13;
&#13;
var worker = new Worker(function(){
  function work(n){
    var res;
    for (var i = 0; i < n; i++){
      res += i * i * i;
    }
    return res;
  }
  
  onmessage = function(event) {
    var result = work(event.data)
    postMessage(result);
    self.close();
  };
});
&#13;
&#13;
&#13;

你正在服务器端做所有繁重的工作,你想把工作放在工人身上。您通过在主线程上工作来阻止整个服务器线程。