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函数?
答案 0 :(得分:4)
这里要注意的要点是onmessage()和postmessage()用作主线程和工作线程之间的消息承载。这最初可能会令人困惑。所以流程就像这样
创建工作线程。
var fibo= new Worker...
这将在节点中产生另一个JavaScript线程。它可以在后台并行运行并使用所有可用的CPU内核。否则在节点中由于其单线程模型,不可能利用多个CPU内核(因此工作线程是处理节点中CPU绑定任务的好方法)
onmessage= function (event) { //reference 1
postMessage(fibo(event.data));
}
b)完成工作后如何与主线程沟通 - postMessage完成这项工作。
postMessage(fibo(event.data));
在主线程中: - 一个。调用工作线程并为其执行任务以执行-ie。使用postmessage(现在你有舞蹈)
fibo.postMessage(40);
湾在工作线程完成作业并响应后,定义有关要执行的操作的侦听器。即。使用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和那些东西,通过一点点解析你有一个新的线程可以使用
至少我是这么认为的