English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS Grund教程

NodeJS Express.js

NodeJS Puffer&URL;

NodeJS MySql

NodeJS MongoDB

NodeJS Datei(FS)

Andere NodeJS

Node.js 多进程

Wir alle wissen, dass Node.js im Ein-Threading-Modus läuft, aber er verwendet Ereignissteuerung, um Konflikte zu behandeln, was uns hilft, mehrere Unterprozesse auf Multicore-CPU-Systemen zu erstellen, um die Leistung zu verbessern.

Jeder Unterprozess verfügt immer über drei Stream-Objekte: child.stdin, child.stdout und child.stderr. Diese können die stdio-Ströme des Elternprozesses teilen oder auch als unabhängige, geleitete Stream-Objekte sein.

Node bietet den child_process-Modul an, um Unterprozesse zu erstellen, wobei die Methoden sind:

  • exec - child_process.exec führt Befehle mit Unterprozessen aus, puffert die Ausgabe des Unterprozesses und gibt die Ausgabe des Unterprozesses als Parameter der Rückruffunktion zurück.

  • spawn - child_process.spawn erstellt einen neuen Prozess mit angegebenen Kommandozeilenargumenten.

  • fork}} - child_process.fork ist eine spezielle Form von spawn(), die für in Unterprozessen ausgeführte Module verwendet wird, wie fork('.',/son.js')) entspricht spawn('node', ['.',/son.js')). Im Gegensatz zur spawn()-Methode erstellt fork zwischen dem Elternprozess und dem Unterprozess eine Kommunikationsleitung, die für die Kommunikation zwischen den Prozessen verwendet wird.

exec() Methode

child_process.exec führt Befehle mit Unterprozessen aus, puffert die Ausgabe des Unterprozesses und gibt die Ausgabe des Unterprozesses als Parameter der Rückruffunktion zurück.

Die Syntax ist wie folgt gezeigt:

child_process.exec(command[, options], callback)

参数

参数说明如下:

command: Zeichenkette, der auszuführende Befehl, Parameter werden durch Leerzeichen getrennt

options : Objekt, kann sein:

  • cwd, Zeichenkette, das aktuelle Arbeitsverzeichnis des Unterprozesses

  • env, Objekt, Schlüssel-Wert-Paare von Umgebungsvariablen

  • encoding, Zeichenkette, Zeichencodierung (Standard: 'utf8'])

  • shell, Zeichenkette, der Shell, der zum Ausführen des Befehls verwendet wird (Standard: im UNIX)/bin/sh, in Windows cmd.exe, der Shell sollte den Shell erkennen -c-Schalter in UNIX oder /s /c in Windows. In Windows sollte die Kommandozeilenauflösung kompatibel mit cmd.exe sein)

  • timeout, Zahl, Zeitüberschreitung (Standard: 0)

  • maxBuffer, Zahl, maximaler Puffer (binär) in stdout oder stderr, der erlaubt ist, wenn dieser Wert überschritten wird, wird der Unterprozess beendet (Standard: 200*1024)

  • killSignal, Zeichenkette, Beendigungssignal (Standard: 'SIGTERM')

  • uid, Zahl, setzt die ID des Benutzerprozesses

  • gid, Zahl, setzt die ID der Prozessgruppe

callback :Rückruffunktion, die drei Parameter error, stdout und stderr enthält.

Die exec()-Methode gibt den größten Puffer zurück und wartet auf das Ende des Prozesses, um den Inhalt des Puffers einmalig zurückzugeben.

在线示例

让我们创建两个 js 文件 support.js 和 master.js。

support.js 文件代码:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js 文件代码:

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, Funktion, (Fehler, stdout, stderr) {
        if (error) {}}
            console.log(error.stack);
            console.log('Fehlercode: ')+error.code);
            console.log('Signal empfangen: ')+error.signal);
        }
        console.log('stdout: ') + stdout);
        console.log('stderr: ') + stderr);
    });
 
    workerProcess.on('exit', function(code) {
        console.log('子进程已退出,退出码 '+code);
    });
}

执行以上代码,输出结果为:

$ node master.js 
子进程已退出,退出码 0
stdout: Prozess 1 执行。
stderr: 
子进程已退出,退出码 0
stdout: Prozess 0 wird ausgeführt.
stderr: 
子进程已退出,退出码 0
stdout: Prozess 2 执行。
stderr:

spawn() Methode

child_process.spawn erstellt einen neuen Prozess mit den angegebenen Befehlszeilenargumenten und hat die folgende Syntax:

child_process.spawn(command[, args][, options])

参数

参数说明如下:

command: Auszuführende Befehl

args: Array Zeichenfolge-Parameterarray

options Object

  • cwd String 子进程的当前工作目录

  • env Object 环境变量键值对

  • stdio Array|String Die stdio-Konfiguration des Unterprozesses

  • detached Boolean Dieser Unterprozess wird zum Führer der Prozessgruppe

  • uid Number 设置用户进程的 ID

  • gid Number 设置进程组的 ID

Die spawn()-Methode gibt Ströme (stdout & stderr) zurück und wird verwendet, wenn der Prozess eine große Menge an Daten zurückgibt. spawn() beginnt mit dem Empfang der Antworten, sobald der Prozess beginnt, ausgeführt zu werden.

在线示例

让我们创建两个 js 文件 support.js 和 master.js。

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);   });}

执行以上代码,输出结果为:

$ node master.js stdout: Prozess 0 wird ausgeführt.
子进程已退出,退出码 0
stdout: Prozess 1 执行。
子进程已退出,退出码 0
stdout: Prozess 2 执行。
子进程已退出,退出码 0

Fork-Methode

child_process.fork ist eine spezielle Form der spawn()-Methode, um Prozesse zu erstellen und hat die folgende Syntax:

child_process.fork(modulePath[, args][, options])

参数

参数说明如下:

modulePath: String,将要在子进程中运行的模块

args: Array 字符串参数数组

options:Object

  • cwd String 子进程的当前工作目录

  • env Object 环境变量键值对

  • execPath String 创建子进程的可执行文件

  • execArgv Array 子进程的可执行文件的字符串参数数组(默认: process.execArgv)

  • silent Boolean 如果为true,子进程的stdin,stdout和stderr将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false)

  • uid Number 设置用户进程的 ID

  • gid Number 设置进程组的 ID

返回的对象除了拥有ChildProcess示例的所有方法,还有一个内建的通信信道。

在线示例

让我们创建两个 js 文件 support.js 和 master.js。

support.js 文件代码:

console.log("进程 " + process.argv[2] + " 执行。" );

master.js 文件代码:

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);   });}

执行以上代码,输出结果为:

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0