Node.js Multi-Prozess
Wir alle wissen, dass Node.js Single-Thread-Modus, aber es verwendet wird, zu handhaben gleichzeitig ereignisgesteuert, die uns mehrere Teilprozesse auf Multi-Core-CPU-System schaffen helfen, die Leistung verbessert.
Jedes Kind ist immer mit drei Flußobjekte: child.stdin, child.stdout und child.stderr. Sie können den stdio Stream Eltern-Prozess teilen, oder es kann auch unabhängig Stream-Objekt gelenkt werden.
Node bietet child_process Module einen untergeordneten Prozess zu schaffen, durch:
exec - child_process.exec Verwendung Run Kind - Prozess, der Kind - Prozess - Ausgangspuffer, und der Ausgang des Kindes Prozess wird in Form einer Callback - Funktion Parameter zurückgegeben.
laichen - child_process.spawn die angegebenen Befehlszeilenparameter mit Hilfe eines neuen Verfahrens zu erstellen.
Gabel - child_process.fork wird laichen () spezielle Form für das Modul in das Kind läuft, wie Gabel ( './ son.js') entspricht , um zu laichen ( "Knoten", [ ' ./son.js' ]).Der Unterschied ist der Laich Methode, Gabel in zwischen Eltern und Kind-Prozess, eine Kommunikationsleitung für die Kommunikation zwischen Prozessen etablieren.
exec () Methode
child_process.exec Verwendung Run Kind-Prozess, der Kind-Prozess-Ausgangspuffer, und der Ausgang des Kindes Prozess wird in Form einer Callback-Funktion Parameter zurückgegeben.
Die Syntax lautet wie folgt:
child_process.exec(command[, options], callback)
Parameter
Parameter sind wie folgt:
command: String, der Befehl ausgeführt werden soll, die durch Leerzeichen getrennte Parameter
Optionen: Objekte können sein:
- Das aktuelle Arbeitsverzeichnis cwd, String, der Kind-Prozess
- env, das Objekt der wichtigsten Umgebungsvariablen
- Codierung, Schnur, Zeichencodierung (Standard: 'utf8')
- Schale, Schnur, der Kommando - Shell (Standard auszuführen: unter UNIX
/bin/sh
, wie in Windowscmd.exe
, Shell sollten in der Lage zu identifizieren-c
Schalter in UNIX oder/s /c
in Windows. in Windows kann die Befehlszeile Parsen kompatibelcmd.exe
) - Timeout, digital, Timeout (default: 0)
- maxBuffer, digital, die maximale Puffer in stdout oder stderr dürfen existieren (binär), so dass, wenn das Kind über getötet werden (Standard: 200 * 1024)
- killSignal, String-Ende-Signal (Standard: 'SIGTERM')
- uid, digital, stellen Sie die Benutzer-ID des Prozesses
- gid, digital, eingestellt Prozessgruppen-ID
Rückruf: Callback - Funktion hat drei Argumente Fehler, stdout und stderr.
exec () -Methode gibt den maximalen Puffer, und warten Sie auf das Ende des Prozesses, eine einmalige, den Inhalt des Puffers zurück.
Beispiele
Lassen Sie uns zwei js Dateien support.js und master.js erstellen.
support.js Datei Code:
console.log("进程 " + process.argv[2] + " 执行。" );
master.js Datei Code:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) { if (error) { console.log(error.stack); console.log('Error code: '+error.code); console.log('Signal received: '+error.signal); } console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); }); workerProcess.on('exit', function (code) { console.log('子进程已退出,退出码 '+code); }); }
Die Umsetzung des obigen Codes ist die Ausgabe:
$ node master.js 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
spawn () -Methode
child_process.spawn die angegebenen Befehlszeilenparameter mit Hilfe eines neuen Verfahrens zu erstellen, die Syntax ist wie folgt:
child_process.spawn(command[, args][, options])
Parameter
Parameter sind wie folgt:
Befehl: Der Befehl auszuführen
args: Array String - Parameter Array
Optionen Object
- Cwd String aktuelle Arbeitsverzeichnis des Kindes Prozess
- env Object Umgebungsvariable Schlüssel-Wert-Paare
- Stdio Array | Stdio Konfiguration String subprocess
- Dieses Kind abgelöst Boolean wird eine Prozessgruppenführer
- UID-Nummer die Benutzer-ID des Prozesses eingestellt
- gid Anzahl eingestellt Prozessgruppen-ID
spawn () -Methode gibt den Strom (stdout & stderr), in dem Verfahren verwendet, um große Mengen von Daten zurückgeben. Nach dem Start der Prozess, wenn die spawn () begann eine Antwort zu erhalten.
Beispiele
Lassen Sie uns zwei js Dateien support.js und master.js erstellen.
support.js Datei Code:
console.log("进程 " + process.argv[2] + " 执行。" );
master.js Datei Code:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var workerProcess = child_process.spawn('node', ['support.js', i]); workerProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); workerProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); workerProcess.on('close', function (code) { console.log('子进程已退出,退出码 '+code); }); }
Die Umsetzung des obigen Codes ist die Ausgabe:
$ node master.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 子进程已退出,退出码 0 stdout: 进程 2 执行。 子进程已退出,退出码 0
Gabel-Methode
child_process.fork ist eine besondere Form der Laich () Methode für Prozesse zu schaffen, die Syntax ist wie folgt:
child_process.fork(modulePath[, args][, options])
Parameter
Parameter sind wie folgt:
ModulePath: String, werden bei einem Kind Prozessmodul ausgeführt
args: Array String - Parameter Array
Optionen: Object
- Cwd String aktuelle Arbeitsverzeichnis des Kindes Prozess
- env Object Umgebungsvariable Schlüssel-Wert-Paare
- execPath String erstellen einen untergeordneten Prozess der ausführbaren Datei
- String-Parameter Array execArgv Array Kinder ausführbare Datei (default: process.execArgv)
- Wenn stille Boolean
true
, das Kindstdin
,stdout
undstderr
werden dem übergeordneten Prozess verknüpft werden, andernfalls werden sie von dem übergeordneten Prozess vererbt werden. (Default:false
) - UID-Nummer die Benutzer-ID des Prozesses eingestellt
- gid Anzahl eingestellt Prozessgruppen-ID
Das zurückgegebene Objekt zusätzlich zu allen Methoden ChildProcess Beispiel haben, gibt es eine eingebaute Kommunikationskanal.
h3> BeispieleLassen Sie uns zwei js Dateien support.js und master.js erstellen.
support.js Datei Code:
console.log("进程 " + process.argv[2] + " 执行。" );
master.js Datei Code:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var worker_process = child_process.fork("support.js", [i]); worker_process.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
Die Umsetzung des obigen Codes ist die Ausgabe:
$ node master.js 进程 0 执行。 子进程已退出,退出码 0 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0