Der Knoten hat mehrere Threads, aber JavaScript, das auf V8 ausgeführt wird, ist ein einzelnes Thread. Das Child_Process -Modul des Knotens wird verwendet, um untergeordnete Prozesse zu erstellen, und wir können die CPU durch untergeordnete Prozesse vollständig nutzen. Beispiel:
Die Codekopie lautet wie folgt:
var fork = required ('child_process'). fork;
// Holen Sie sich die CPU -Anzahl der aktuellen Maschine
var cpus = require ('os'). cpus ();
für (var i = 0; i <cpus.length; i ++) {
// einen neuen Prozess generieren
gabel ('./ Worker.js');
}
Hier sind einige Möglichkeiten, um Prozesse einschließlich der Gabel zu erstellen:
1.Spawn (Befehl, [Args], [Optionen]), starten Sie einen neuen Prozess, um den Befehlsbefehl auszuführen. Args ist ein Befehlszeilenparameter
2.exec (Befehl, [Optionen], Rückruf), starten Sie einen neuen Prozess, um den Befehlsbefehl auszuführen. Der Rückruf wird verwendet, um am Ende des Prozesses Standardeingabe-, Standardausgabe- und Fehlerinformationen zu erhalten.
3.execFile (Datei, [Args], [Optionen], [Callback]) startet einen neuen Prozess, um die ausführbare Datei auszuführen. Der Rückruf wird verwendet, um Standardeingangs-, Standardausgabe- und Fehlerinformationen am Ende des Prozesses zu erhalten.
4.Fork (Modulepath, [Args], [Optionen]) Starten Sie einen neuen Prozess, um ein JavaScript -Dateimodul auszuführen, und der Knoten -Kinderprozess wird zu diesem Zeitpunkt erstellt.
Knoten -Interprozesskommunikation
Elternprozess
Die Codekopie lautet wie folgt:
// parent.js
var fork = required ('child_process'). fork;
// fork gibt untergeordnetes Prozessobjekt n zurück
var n = fork ('./ Child.js');
// Ereignisnachricht handhaben
N.on ('Nachricht', Funktion (m) {
// Erhalten Sie eine vom Kinderprozess gesendete Nachricht
console.log ('Got meldung:' + m);
});
// Sende eine Nachricht an den Kinderprozess
N.Send ({Hallo: 'World'});
Subprozess
Die Codekopie lautet wie folgt:
// Child.js
// Ereignisnachricht handhaben
process.on ('message', function (m) {
console.log ('Got meldung:' + m);
});
// Die Send -Methode gibt es zum Senden von Nachrichten an den übergeordneten Prozess.
process.send ({foo: 'bar'});
Es ist zu beachten, dass die Send -Methode hier synchron ist. Daher wird nicht empfohlen, große Datenmengen zu senden (Sie können stattdessen Pipe verwenden, siehe http://nodejs.org/api/all.html#child, dass Details für Details_Child_Child_process_spawn_command_args_opions).
In besonderen Fällen enthält der CMD -Attributwert in der Nachricht das NODE_ -Präfix (z. B. {CMD: 'node_foo'} Nachricht), diese Nachricht wird dann nicht an das Nachrichtenereignis (sondern das interneMessage -Ereignis) übermittelt und wird intern vom Knoten verwendet.
Der Prototyp der Send -Methode lautet:
Die Codekopie lautet wie folgt:
Senden (Nachricht, [sendHandle])
Hier kann SendHandle (Handle) zum Senden verwendet werden:
1.NET.NATIVE, native C ++ TCP -Socket oder Pipeline
2.NET.SERVER, TCP Server
3.NET.Socket, TCP Socket
4.Dgram.NATIVE, native C ++ - UDP -Socket
5.Dgram.Socket, UDP -Sockel
Senden beim Senden von SendHandle wird es nicht (und kann nicht) JavaScript -Objekte direkt senden, sondern einen Dateideskriptor (schließlich als JSON -Zeichenfolge gesendet) zu senden. Andere Prozesse können das entsprechende Objekt über diesen Dateideskriptor wiederherstellen.
Schauen Sie sich nun ein Beispiel an:
Elternprozess
Die Codekopie lautet wie folgt:
// parent.js
var fork = required ('child_process'). fork;
var n = fork ('./ Child.js');
var server = require ('net'). createServer ();
server.Listen (7000, function () {
// TCP -Server an einen untergeordneten Prozess senden
N.Send ('Server', Server);
}). on ('Connection', function () {
console.log ('Verbindung - Eltern');
});
Subprozess
Die Codekopie lautet wie folgt:
process.on ('message', function (m, h) {
if (m === 'Server') {
H.on ('Verbindung', function () {
console.log ('Verbindung - Kind');
});
}
});
Wenn Sie über Port 7000 auf dieses Programm zugreifen, können Sie die Ausgabe als Anschluss übergeordnetes oder -verbindungskindes führen. Hier hören der Kinderprozess und der übergeordnete Prozess gleichzeitig Port 7000 an. Im Allgemeinen verursacht mehrere Prozesse, die denselben Port anhören, eine Eaddrinuse -Ausnahme. In diesem Fall verwenden zwei verschiedene Prozesse denselben Dateideskriptor, und die zugrunde liegende Schicht legt die Option SO_ReuseadDR auf der Socket fest, wenn Sie den Port anhören, mit dem dieser Socket zwischen verschiedenen Prozessen wiederverwendet werden kann. Wenn mehrere Prozesse denselben Port anhören, kann der Dateideskriptor nur von einem Prozess gleichzeitig verwendet werden, und diese Prozesse verwenden Sockets präventiv.
Clustermodul
Ein neues Clustermodul wurde zu V0.8 im Knoten hinzugefügt, durch das das Cluster -Modul problemlos eine Gruppe von Prozessen erstellen kann, die denselben Port auf einer physischen Maschine anhören. Beispiel:
Die Codekopie lautet wie folgt:
var cluster = required ('cluster');
var http = required ('http');
var numcpus = required ('os'). cpus (). Länge;
// Überprüfen Sie, ob der Prozess ein Masterprozess ist
if (cluster.ismaster) {
für (var i = 0; i <numcpus; ++ i)
// Erstellen Sie einen neuen Arbeiterprozess (nur der Master -Prozess kann aufgerufen werden)
cluster.fork ();
cluster.on ('exit', function (Worker, Code, Signal) {
console.log ('Worker' + Worker.Process.pid + 'Die');
});
} anders {
http.createServer (Funktion (req, res) {{
Res.WriteHead (200);
res.end ('Hello World/n');
}). Hören (8000);
}
Wir rufen die Hörmethode im Arbeitsprozess auf, und die Höranfrage wird an den Master -Prozess übergeben. Wenn der Master -Prozess bereits über einen Server verfügt, der die Anforderungen des Arbeitsprozesses erfüllt, wird das Handle dieses Servers an den Arbeiter weitergegeben. Wenn es nicht vorhanden ist, erstellt der Hauptprozess einen und übergibt den Griff an den Arbeitsprozess.
Detaillierte Dokumentation zu Cluster: http://www.nodejs.org/api/cluster.html