有人可以解释webworker线程的例子吗?
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函数?
这里需要注意的是,onmessage()和postmessage()被用作主线程和工作线程之间的消息承载。 这最初可能会让人困惑。 所以stream量是这样的
-
创build一个工作线程。
var fibo= new Worker...
这将在节点中产生另一个JavaScript线程。 它可以在后台并行运行并使用所有可用的CPU核心。 否则,由于其单线程模型,在节点中,利用多个CPU核心是不可能的(因此,工作线程是处理节点中CPU限制任务的好方法)
- 在工作者线程中,我们定义a)如何处理接收到的请求/工作 – onmessage()完成这项工作。 它会监听任何传入的工作请求并采取行动。
onmessage= function (event) { //reference 1 postMessage(fibo(event.data)); }
b)一旦完成工作,如何与主线程通信 – postMessage完成这项工作。
postMessage(fibo(event.data));
-
在主线程中: – a。 调用工作线程并给它一个执行-ie的任务。 使用postmessage(现在你得到了舞蹈)
fibo.postMessage(40);
湾 定义监听者关于一旦工作线程完成工作并采取响应的动作。 即。 使用onmessage。
fibo.onmessage = function (event) { //reference 2 res.end('fib(40) = ' + event.data);
};
试试这个代码:
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
关键的是,它必须在另一个节点上运行,所以这意味着在某个时刻它的行为(甚至没有closures,但仍然适用)
上class族{ 构造(fnToRun){ child_process.spawn('thread-creator-process',[ '-fn',转义(fnToRun.toString()) ]); } }
所以现在另一个哥们可以做一些类似的事情
var result = new Function('context', '与(上下文){' + ''+ fnAsString + '}' 结果(thisThreadContext);
现在上下文有onmessage引用它将被创build,它可以已经有一个引用postMessage和这些东西,一点点parsing你有一个新的线程来处理
至less我认为这样