我是来自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));
};
答案 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
实现并不完美匹配。