这篇文章主要介绍nodejs怎么进行多线程处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Threads à Gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能。【推荐学习:《
这篇文章主要介绍nodejs怎么进行多线程处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Threads à Gogo 是nodejs 的原生模块,使用这个模块可以让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 objectvar thread = tagg.create( ) //生成 thread objectvar thread_pool = tagg.createPool( numberOfThreads ) //生成 thread poolthread.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 filepool.any.eval( program, cb ) //pool中的任意(.all 为全部)thread执行program
为什么要用多线程?
平行执行,无需排队,快速。
公平性,所有线程统一优先级。
完整利用资源,让更多的CPU参与task的处理。
所有线程共用一个储存地址。
实例
我们先来做一个简单的测试,用斐波那契数组来看一下,加入了多线程的node有多么的强悍:(测试机器为4CPU)没有使用TAGG的正常情况,异步也帮不了我们应对cpu密集型任务
function fibo (n) {return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;}var n=8function 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还是异步方法。最后我们输出结果为:
165580141165580141165580141165580141165580141165580141165580141165580141no thread: 23346ms
接下来我们使用TAGG模块来测试同样的执行8次斐波那契数组计算,看看成绩如何?
function fibo (n) {return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;}console.time('8 thread');var numThreads= 8; //创建线程池,最大数为8var 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);
最重的结果:
1655801411655801411655801411655801411655801411655801411655801411655801418 thread: 9510ms
相比不使用多线程模型的node,使用了TAGG模块之后,我们在4CPU服务器上的测试结果要快上一倍还不止。
TAGG模块还有其他更多的功能,比如事件触发,平滑退出,查看线程工作状态等等,总之TAGG模块给node注入了新的活力,让node一直饱受诟病的处理cpu密集任务问题得到了一个妥善的解决,就算你不擅长c++代码,也能够轻松编写出多线程的真正的非阻塞node程序了。
以上是“Nodejs怎么进行多线程处理”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!
--结束END--
本文标题: Nodejs怎么进行多线程处理
本文链接: https://lsjlt.com/news/279165.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0