Node.jsマルチプロセス


Node.js がシングルスレッド モードで実行されることは誰もが知っていますが、イベント駆動型を使用して同時実行を処理するため、マルチコア CPU システム上に複数の子プロセスを作成してパフォーマンスを向上させることができます。

各子プロセスには常に、child.stdin、child.stdout、child.stderr の 3 つのストリーム オブジェクトがあります。これらは、親プロセスの stdio ストリームを共有することも、独立したリダイレクトされたストリーム オブジェクトであることもあります。

Node は、子プロセスを作成するための child_process モジュールを提供します。メソッドは次のとおりです。

  • exec - child_process.exec は、子プロセスを使用してコマンドを実行し、子プロセスの出力をキャッシュし、その出力を使用します。子プロセスはコールバック関数のパラメータを返します。

  • spawn - child_process.spawn は、指定されたコマンドライン引数を使用して新しいプロセスを作成します。

  • fork - child_process.fork は、spawn() の特別な形式であり、子プロセスで実行されるモジュール (spawn('node', と同等の fork('./son.js') など) に使用されます。 [' ./son.js']) 。 spawn メソッドとは異なり、fork はプロセス間の通信のために親プロセスと子プロセスの間に通信チャネルを確立します。


exec() メソッド

child_process.exec は、子プロセスを使用してコマンドを実行し、子プロセスの出力をキャッシュし、子プロセスの出力をコールバック関数パラメータの形式で返します。

構文は次のとおりです:

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

パラメータ

パラメータの説明は次のとおりです:

コマンド: 文字列、実行するコマンド。パラメータはスペースで区切られます。

オプション: オブジェクト。 :

  • cwd 、string、子プロセスの現在の作業ディレクトリ

  • env、オブジェクト環境変数のキーと値のペア

  • encoding 、string、文字エンコーディング (デフォルト: 'utf8')

  • shell 、 string 、コマンドを実行するシェル (デフォルト: UNIX の

    ) /bin/sh, 在 Windows 中为cmd.exe, Shell 应当能识别 -c开关在 UNIX 中,或 /s /c 在 Windows 中。 在Windows 中,命令行解析应当能兼容cmd.exe

  • timeout、数値、タイムアウト (デフォルト: 0)

  • maxBuffer、数値、標準出力に存在できる最大バッファーまたは stderr (binary )、超過した場合、子プロセスは強制終了されます (デフォルト: 200*1024)

  • killSignal、文字列、終了シグナル (デフォルト: 'SIGTERM')

  • uid、数値、ID を設定ユーザープロセスの

  • gid、番号、プロセスグループのIDを設定します

callback: コールバック関数、stdoutとstderrの3つのパラメータが含まれます。

exec() メソッドは最大のバッファを返し、プロセスが終了するのを待って、バッファの内容を一度に返します。

support.js と master.js という 2 つの 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,
      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);
   });
}

上記のコードを実行すると、出力結果は次のようになります:

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

stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。

stderr:

spawn() メソッド

child_process.spawn は、指定されたコマンド ライン パラメーターを使用して新しいプロセスを作成します。 構文形式は次のとおりです。

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

parameters

パラメーターの説明は次のとおりです。

command: 実行するコマンド

args : Array String パラメータ array

options Object

  • cwd String 子プロセスの現在の作業ディレクトリ

  • env Object 環境変数のキーと値のペア

  • stdio Array|String 子プロセスの stdio 設定

  • detached Boolean この子プロセスはプロセス グループのリーダーになります

  • uid Number ユーザー プロセスの ID を設定します

  • gid Number Setプロセス グループの ID

spawn() メソッドは、プロセスが大量のデータを返すときに使用されるストリーム (stdout および stderr) を返します。 spawn() は、プロセスの実行が開始されるとすぐに応答の受信を開始します。

support.js と master.js という 2 つの 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.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: 进程 0 执行。

子进程已退出,退出码 0
stdout: 进程 1 执行。

子进程已退出,退出码 0
stdout: 进程 2 执行。

子进程已退出,退出码 0

fork メソッド

child_process.fork は spawn() メソッドの特別な形式です、プロセスの作成に使用され、構文形式は次のとおりです:

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

パラメータ

パラメータの説明は次のとおりです:

modulePath: 文字列、子プロセスで実行されるモジュール

args: 配列String パラメータ array

options: Object

  • cwd String 子プロセスの現在の作業ディレクトリ

  • env Object 環境変数のキーと値のペア

  • String 子プロセスの実行可能ファイルを作成する

  • execArgv 配列 子プロセスの実行ファイル 文字列パラメータ配列 (デフォルト: process.execArgv)

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

  • uid 数値 ユーザープロセスの ID を設定します

  • gid Number プロセス グループの ID を設定します

返されたオブジェクト ChildProcess インスタンスのすべてのメソッドに加えて、組み込みの通信チャネルもあります。

h3>例

support.js と master.js という 2 つの 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