NodeJS中的Webworker-threads

时间:2015-06-20 21:52:19

标签: javascript node.js multithreading

我是来自C#世界的NodeJS新手,仍然试图了解复杂的JavaScript迷宫。 我试图在https://www.npmjs.com/package/webworker-threads上的示例中实现多线程。

无法理解下面的原因:

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

require('http').createServer(function (req,res) {
  console.log('request received.');
  var fibo = new Worker(function() {
    var calcFib = function (n) {
      return n > 1 ? calcFib(n - 1) + calcFib(n - 2) : 1;
    };
    this.onmessage = function (event) {
      postMessage(calcFib(event.data));
    };
  });
  fibo.onmessage = function (event) {
    var msg = 'fib(5) = ' + event.data;
    console.log(msg);
    res.end(msg);
  };
  fibo.postMessage(5);
}).listen(3000);

但是下面的内容并没有

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

//the below function just does not get called
var calcFib = function (n) {
    console.log('***This will not print. Can someone explain why?***');
    return n > 1 ? calcFib(n - 1) + calcFib(n - 2) : 1;
};

require('http').createServer(function (req,res) {
  console.log('request received.');
  var fibo = new Worker(function() {    
    this.onmessage = function (event) {
      postMessage(calcFib(event.data));
    };
  });
  fibo.onmessage = function (event) {
    var msg = 'fib(5) = ' + event.data;
    console.log(msg);
    res.end(msg);
  };
  fibo.postMessage(5);
}).listen(3000);

为什么如果我取出calcFib的范围,它就无法调用我的想法是在webworker-threads上实现一个包装器,可以用来在另一个线程上执行任何CPU内部操作。但是,我甚至无法调用外部函数

以下是回复Benjamin Gruenbaum回答:

如何在onmessage中调用console.log,而不是在同一文件中调用范围之外的我的函数?

this.onmessage = function (event) {
  console.log('can call console.log even if it is external');
  //cannot call calcFib(event.data) if it is defined outside the scope.
  postMessage(calcFib(event.data));
};

2 个答案:

答案 0 :(得分:3)

工作人员通过复制代码来工作,因此所有关闭数据都将丢失。您无法从工作人员中访问闭包范围,因此calcFib未定义。

您需要在工作室代码中定义calcFib ,或通过消息eval发送它。

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

require('http').createServer(function (req,res) {
  console.log('request received.');

  var fibo = new Worker(function() {    
    //the below function just does not get called
    var calcFib = function (n) {
      console.log('***This will not print. Can someone explain why?***');
      return n > 1 ? calcFib(n - 1) + calcFib(n - 2) : 1;
    };
    this.onmessage = function (event) {
      postMessage(calcFib(event.data));
    };
  });
  fibo.onmessage = function (event) {
    var msg = 'fib(5) = ' + event.data;
    console.log(msg);
    res.end(msg);
  };
  fibo.postMessage(5);
}).listen(3000);

答案 1 :(得分:2)

我是node-webworker-threads项目的合作者。

为什么你的代码不起作用

node-webworker-threads工作人员必须学习他们被要求执行的所有功能。它们存在于单独的命名空间中,因此即使在同一个文件中它们也看不到它们,除非您明确告诉它们。您可以使用node-webworker-threads的{​​{1}}和load API告诉他们必要的功能。

eval工人可以做什么

node-webworker-threads工作人员可以执行本机JavaScript功能,如数组和对象,与JSON和正则表达式交互等。这些工作者还支持某些特定于Node.js的内置函数,例如console.log。这就是为什么你可以调用node-webworker-threads(支持的内置)而不是你的函数(在worker的命名空间之外)。如上所述[{3}},在某些情况下,内置API的console.log实现并不完美匹配。