• 技术文章 >web前端 >js教程

    浅谈Nodejs如何进行多线程处理

    青灯夜游青灯夜游2021-06-15 18:17:16转载220
    本篇文章给大家介绍一下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 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

    接下来我们使用TAGG模块来测试同样的执行8次斐波那契数组计算,看看成绩如何?

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

    最重的结果:

    165580141
    165580141
    165580141
    165580141
    165580141
    165580141
    165580141
    165580141
    8 thread: 9510ms

    相比不使用多线程模型的node,使用了TAGG模块之后,我们在4CPU服务器上的测试结果要快上一倍还不止。

    TAGG模块还有其他更多的功能,比如事件触发,平滑退出,查看线程工作状态等等,总之TAGG模块给node注入了新的活力,让node一直饱受诟病的处理cpu密集任务问题得到了一个妥善的解决,就算你不擅长c++代码,也能够轻松编写出多线程的真正的非阻塞node程序了。  

    更多编程相关知识,请访问:编程教学!!

    以上就是浅谈Nodejs如何进行多线程处理的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:Nodejs 多线程处理
    上一篇:一文了解JavaScript中合并和克隆对象的方法 下一篇:浅谈Angular中父子组件间相互传参的方法
    第16期线上培训班

    相关文章推荐

    • 浅谈Nodejs中的callback回调• 如何使用Nodejs连接Mysql,实现基本的增删改查操作• 深入了解调试nodejs程序的方法• 浅谈浏览器中本地运行Node.js的方法• 一起了解Nodejs和命令行程序• 聊聊Nodejs中的模块化和事件循环

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网