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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow