Node.js
Multithreading
Recherche…
Introduction
Node.js a été conçu pour être mono-threadé. Donc, à toutes fins utiles, les applications qui démarrent avec Node s'exécuteront sur un seul thread.
Cependant, Node.js lui-même s'exécute en multi-thread. Les opérations d'E / S et autres s'exécuteront à partir d'un pool de threads. En outre, toute instance d'une application de noeud s'exécutera sur un thread différent. Par conséquent, pour exécuter des applications multithread, vous devez lancer plusieurs instances.
Remarques
Comprendre la boucle d'événement est important pour comprendre comment et pourquoi utiliser plusieurs threads.
Grappe
Le module cluster
permet de démarrer la même application plusieurs fois.
Le regroupement est souhaitable lorsque les différentes instances ont le même flux d'exécution et ne dépendent pas les unes des autres. Dans ce scénario, vous avez un maître qui peut démarrer les fourches et les fourches (ou les enfants). Les enfants travaillent de manière autonome et disposent d'un espace unique entre Ram et Event Loop.
La configuration de clusters peut être bénéfique pour les sites Web / API. Tout thread peut servir n'importe quel client, car il ne dépend pas d'autres threads. Une base de données (comme Redis) serait utilisée pour partager les cookies, car les variables ne peuvent pas être partagées! entre les fils.
// runs in each instance
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
console.log('I am always called');
if (cluster.isMaster) {
// runs only once (within the master);
console.log('I am the master, launching workers!');
for(var i = 0; i < numCPUs; i++) cluster.fork();
} else {
// runs in each fork
console.log('I am a fork!');
// here one could start, as an example, a web server
}
console.log('I am always called as well');
Processus de l'enfant
Les processus enfants sont la voie à suivre pour exécuter des processus de manière indépendante avec des initialisations et des préoccupations différentes. Comme les fourches dans les clusters, un child_process
exécuté dans son thread, mais contrairement aux forks, il a un moyen de communiquer avec ses parents.
La communication se fait dans les deux sens, afin que les parents et les enfants puissent écouter les messages et envoyer des messages.
Parent (../parent.js)
var child_process = require('child_process');
console.log('[Parent]', 'initalize');
var child1 = child_process.fork(__dirname + '/child');
child1.on('message', function(msg) {
console.log('[Parent]', 'Answer from child: ', msg);
});
// one can send as many messages as one want
child1.send('Hello'); // Hello to you too :)
child1.send('Hello'); // Hello to you too :)
// one can also have multiple children
var child2 = child_process.fork(__dirname + '/child');
Enfant (../child.js)
// here would one initialize this child
// this will be executed only once
console.log('[Child]', 'initalize');
// here one listens for new tasks from the parent
process.on('message', function(messageFromParent) {
//do some intense work here
console.log('[Child]', 'Child doing some intense work');
if(messageFromParent == 'Hello') process.send('Hello to you too :)');
else process.send('what?');
})
À côté du message, vous pouvez écouter de nombreux événements tels que «erreur», «connecté» ou «déconnecter».
Le démarrage d'un processus enfant est associé à un certain coût. On voudrait en engendrer le moins possible.