前言
Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能
安装方法
1 | npm install threads_a_gogo |
下载测试源码
1 | git clone http: //github.com/xk/node-threads-a-gogo.git |
导入模块代码
1 | var tagg= require( 'threads_a_gogo' ); |
API
1 2 3 4 5 6 | 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密集型任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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还是异步方法。最后我们输出结果为:
1 2 3 4 5 6 7 8 9 | 165580141 165580141 165580141 165580141 165580141 165580141 165580141 165580141 no thread: 23346ms |
接下来我们使用TAGG模块来测试同样的执行8次斐波那契数组计算,看看成绩如何?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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); |
1 | <br>最重的结果: |
1 2 3 4 5 6 7 8 9 | 165580141 165580141 165580141 165580141 165580141 165580141 165580141 165580141 8 thread: 9510ms |
相比不使用多线程模型的node,使用了TAGG模块之后,我们在4CPU服务器上的测试结果要快上一倍还不止。
TAGG模块还有其他更多的功能,比如事件触发,平滑退出,查看线程工作状态等等,总之TAGG模块给node注入了新的活力,让node一直饱受诟病的处理cpu密集任务问题得到了一个妥善的解决,就算你不擅长c++代码,也能够轻松编写出多线程的真正的非阻塞node程序了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?