Maison >interface Web >js tutoriel >Une brève discussion sur la façon dont Nodejs effectue le traitement multi-thread

Une brève discussion sur la façon dont Nodejs effectue le traitement multi-thread

青灯夜游
青灯夜游avant
2021-06-04 11:14:503366parcourir

Cet article vous présentera la méthode du multi-threading dans Nodejs. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Une brève discussion sur la façon dont Nodejs effectue le traitement multi-thread

Threads à gogo est un module natif de nodejs. L'utilisation de ce module peut permettre à nodejs d'avoir des capacités de traitement multi-thread. [Apprentissage recommandé : "Tutoriel nodejs"]

Méthode d'installation

npm install threads_a_gogo

Télécharger le code source du test

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

Importer le code du module

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

Pourquoi utiliser le multi-threading ?

1. Exécution parallèle, pas besoin de faire la queue, rapide.

2. Équité, tous les fils de discussion ont la même priorité.

3. Exploitez pleinement les ressources et permettez à davantage de processeurs de participer au traitement des tâches.

4. Tous les fils de discussion partagent une adresse de stockage.

Exemple

Faisons d'abord un test simple, utilisons le tableau de Fibonacci pour le voir et ajoutons un nœud multithread Quelle est sa puissance : (La machine de test est 4CPU) Sans l'utilisation normale de TAGG, l'asynchrone ne peut pas nous aider à gérer les tâches gourmandes en 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();
})

Nous avons simulé 8 comportements asynchrones pour tester la version du nœud v0.8.16, donc process.nextTick est toujours une méthode asynchrone. Enfin, notre résultat de sortie est :

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

Ensuite, nous utilisons le module TAGG pour tester la même exécution de 8 calculs de tableaux de Fibonacci et voir quels sont les résultats ?

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

Le résultat le plus important :

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

Par rapport au nœud qui n'utilise pas le modèle multi-threading, après utilisation du module TAGG, nos résultats de tests sur le serveur 4CPU sont un pas plus vite. Plus du double.

Le module TAGG a de nombreuses autres fonctions, telles que le déclenchement d'événements, la sortie en douceur, la vérification de l'état de fonctionnement des threads, etc. En bref, le module TAGG injecte une nouvelle vitalité dans le nœud. le problème du nœud qui a été critiqué pour la gestion de tâches gourmandes en CPU a été correctement résolu Même si vous n'êtes pas bon en code C++, vous pouvez facilement écrire multithread et véritablement non bloquant <.> programme de nœuds.  

Pour plus de connaissances liées à la programmation, veuillez visiter :

Enseignement de la programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer