美文网首页
浅谈Nodejs如何进行多线程处理

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

作者: 浅浅而谈 | 来源:发表于2021-06-22 09:58 被阅读0次

本篇文章给大家介绍一下Nodejs进行多线程处理的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

image

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程序了。

原文转载地址:https://www.php.cn/js-tutorial-477448.html

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

相关文章

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

    本篇文章给大家介绍一下Nodejs[https://www.php.cn/course/list/24.html]...

  • Nodejs利用GraphicsMagick进行图形处理

    nodejs利用GraphicsMagick进行图形处理 Gm有瑞士军刀 之称,在图形处理非常优秀 进行插件安装 ...

  • node 多进程与session共享

    一、Node如何开启多进程 cluster是一个nodejs内置的模块,用于nodejs多核处理。cluster模...

  • dispatch_semaphore信号量用法

    关于多线程的并发,我们可能会选择使用NSOperationQueue来处理,那么在GCD中如何处理多线程的并发呢?...

  • 深入理解nodejs的HTTP处理流程

    简介 我们已经知道如何使用nodejs搭建一个HTTP服务,今天我们会详细的介绍nodejs中的HTTP处理流程,...

  • node.js

    nodejs特点及应用场景 非阻塞的IO (与其他技术的最大区别,文件读取,【php服务器 多线程处理,多核CPU...

  • 多线程相关

    1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器...

  • nodejs——path模块

    nodejs中有一组流API,连续处理文件非常方便,但是不能在指定位置进行读写。文件描述符句柄在nodejs中也是...

  • Java多线程并发处理任务

    本文主要通过一个获取某个区间内质数的例子来说明如何使用java进行多线程并发处理任务。 1. 需求: 获取某个区间...

  • 浅谈NodeJS

    NodeJs是什么? js本身是一种脚本语言,脚本语言就需要一个解释器来运行,nodejs就是这个解释器,在浏览器...

网友评论

      本文标题:浅谈Nodejs如何进行多线程处理

      本文链接:https://www.haomeiwen.com/subject/vyupyltx.html