Node.js
Multithreading
Suche…
Einführung
Node.js wurde als Einzelthread konzipiert. Für alle praktischen Zwecke werden Anwendungen, die mit Node gestartet werden, in einem einzigen Thread ausgeführt.
Node.js selbst führt jedoch mehrere Threads aus. E / A-Operationen und dergleichen werden von einem Thread-Pool ausgeführt. Ferner wird jede Instanz einer Knotenanwendung in einem anderen Thread ausgeführt. Um Multithread-Anwendungen auszuführen, werden mehrere Instanzen gestartet.
Bemerkungen
Das Verständnis der Ereignisschleife ist wichtig, um zu verstehen, wie und warum mehrere Threads verwendet werden.
Cluster
Mit dem cluster
Modul kann dieselbe Anwendung mehrmals gestartet werden.
Clustering ist wünschenswert, wenn die verschiedenen Instanzen den gleichen Ausführungsfluss haben und nicht voneinander abhängig sind. In diesem Szenario haben Sie einen Master, der die Gabeln und die Gabeln (oder Kinder) starten kann. Die Kinder arbeiten unabhängig voneinander und haben einen Bereich mit Ram und Ereignisschleife.
Das Einrichten von Clustern kann für Websites / APIs von Vorteil sein. Jeder Thread kann jeden Kunden bedienen, da er nicht von anderen Threads abhängt. Eine Datenbank (wie Redis) würde zum Teilen von Cookies verwendet, da Variablen nicht geteilt werden können! zwischen den Fäden.
// 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');
Kindprozess
Untergeordnete Prozesse sind der Weg zu gehen, wenn Prozesse unabhängig voneinander mit unterschiedlicher Initialisierung und Bedenken ausgeführt werden sollen. Wie Gabeln in Clustern wird ein child_process
in seinem Thread ausgeführt. Im Gegensatz zu Gabeln kann er jedoch mit seinem übergeordneten child_process
kommunizieren.
Die Kommunikation verläuft in beide Richtungen, sodass Eltern und Kinder auf Nachrichten warten und Nachrichten senden können.
Elternteil (../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');
Kind (../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?');
})
Neben der Nachricht können Sie viele Ereignisse wie "Fehler", "Verbunden" oder "Trennen" abhören.
Das Starten eines untergeordneten Prozesses hat bestimmte Kosten zur Folge. Man möchte so wenig wie möglich davon laichen.