Latest web development tutorials

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 Windows cmd.exe , Shell sollten in der Lage zu identifizieren -c Schalter in UNIX oder /s /c in Windows. in Windows kann die Befehlszeile Parsen kompatibel cmd.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 Kind stdin , stdout und stderr 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> 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 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