我们模拟了8个异步的行为, 测试用的node v0.8.16版本,所以 process.nextTick还是异步方法。最后我们输出结果为:function fibo (n) { return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1; } var n=8 function back(){ if(!--n) return console.timeEnd('no thread'); } console.time('no thread'); process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); }) process.nextTick(function(){ console.log(fibo (40)); back(); })
接下来我们使用TAGG模块来测试同样的执行8次斐波那契数组计算,看看成绩如何?165580141 165580141 165580141 165580141 165580141 165580141 165580141 165580141 no thread: 23346ms
最重的结果:function fibo (n) { return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1; } console.time('8 thread'); var numThreads= 8; //创建线程池,最大数为8 var threadPool= require('threads_a_gogo').createPool(numThreads).all.eval(fibo); //为线程池注册程序 var i=8; var cb = function(err,data){ //注册线程执行完毕的回调函数 console.log(data); if(!--i){ threadPool.destroy(); console.timeEnd('8 thread'); } } threadPool.any.eval('fibo(40)', cb); //开始向线程池中执行fibo(40)这个任务 threadPool.any.eval('fibo(40)', cb); threadPool.any.eval('fibo(40)', cb); threadPool.any.eval('fibo(40)', cb); threadPool.any.eval('fibo(40)', cb); threadPool.any.eval('fibo(40)', cb); threadPool.any.eval('fibo(40)', cb); threadPool.any.eval('fibo(40)', cb);
相比不使用多线程模型的node,使用了TAGG模块之后,我们在4CPU服务器上的测试结果要快上一倍还不止。165580141 165580141 165580141 165580141 165580141 165580141 165580141 165580141 8 thread: 9510ms
代码上的复杂程度比使用TAGG要高的多,而且如果是动态计算斐波那契数组的结果,编码将更加困难,需要在fork时挂上不同的参数,出错的几率也更大。同时还有更重要的一个事情,如果是创建一个http服务器,如果4个cluster都在计算fibo,那第5个请求node将无法处理,而是用TAGG则还是能够正常处理的,所以cluster并不能解决单线程模型的cpu密集计算带来的阻塞问题,我们看下测试结果:var cluster = require('cluster'); var numCPUs = 8; function fibo (n) { return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1; } console.time('8 cluster'); if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } var i = 8; cluster.on('exit', function(worker, code, signal) { if(!--i){ console.timeEnd('8 cluster'); process.exit(0); } });
} else { console.log(fibo (40)); process.exit(0); }
165580141 165580141 165580141 165580141 165580141 165580141 165580141 165580141 8 cluster: 11925ms