nodejs怎么实现多线程?

node是单线程的,采用单线程异步非阻塞模式。因为javascript引擎的关系,node默认是单线程,一个node.js应用无法利用多核资源。那么nodejs怎么实现多线程?下面给大家介绍一下,希望对大家有所帮助。

Node可以在不新增额外线程的情况下,依然可以对任务进行并发处理,通过事件循环(event loop)来实现并发操作。

Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能。

安装方法

npm install threads_a_gogo

下载测试源码

git clone http://github.com/xk/node-threads-a-gogo.git  

导入模块代码

var tagg= require('threads_a_gogo');

API

tagg= require('threads_a_gogo') //生成tagg object
var thread = tagg.create( /* no arguments */ ) //生成 thread object
var thread_pool = tagg.createPool( numberOfThreads ) //生成 thread pool
thread.load("boot.js").eval("boot()").emit("go").on("event", cb) 
//thread读取boot.js文件 执行boot(),发送event go,并且监听 event 事件 cb(err,result)
thread_pool.load('path') //pool中的任意(.all 为全部)thread 读取path file
pool.any.eval( program, cb ) //pool中的任意(.all 为全部)thread执行program

为什么要用多线程?

1.平行执行,无需排队,快速。

2.公平性,所有线程统一优先级。

3.完整利用资源,让更多的CPU参与task的处理。

4.所有线程共用一个储存地址。

实例

我们先来做一个简单的测试,用斐波那契数组来看一下,加入了多线程的node有多么的强悍:(测试机器为4CPU)没有使用TAGG的正常情况,异步也帮不了我们应对cpu密集型任务

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();
})

我们模拟了8个异步的行为,测试用的node v0.8.16版本,所以process.nextTick还是异步方法。最后我们输出结果为:

165580141
165580141
165580141
165580141
165580141
165580141
165580141
165580141
no thread: 23346ms

以上就是nodejs怎么实现多线程?的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Node.js答疑