Latest web development tutorials

マルチプロセスをNode.jsの

我々は、すべてのNode.jsはシングルスレッドモードであることを知っているが、それは処理するために使用される、同時イベント駆動型、私たちがパフォーマンスを向上させたマルチコアCPUのシステム上の複数のサブプロセスを作成するのに役立ちます。

child.stdin、child.stdoutとchild.stderr:それぞれの子は3フローオブジェクトといつも一緒です。 これらは、標準入出力ストリームの親プロセスを共有することができる、またはそれはまた、独立したストリームオブジェクトを操縦することができます。

ノードはにより、子プロセスを作成するchild_processモジュールを提供しています。

  • EXEC - child_process.exec使用のファイル名を指定して実行子プロセス、子プロセスの出力バッファ、および子プロセスの出力は、コールバック関数のパラメータの形式で返されます。

  • スポーン-新しいプロセスを作成するために、指定されたコマンドラインパラメータを使用してchild_process.spawn。

  • フォーク- child_process.forkは (「ノード」、[ '産卵に相当するようなフォーク(' ./ son.js ')として子で実行されているモジュールの()特殊な形式、スポーンさ./son.jsを」 ])。違いは、プロセス間通信用の通信コンジットを確立し、親と子プロセスの間にフォーク、スポーン方法です。


exec()メソッド

、子プロセスの出力バッファを実行して子プロセスを使用child_process.execし、子プロセスの出力は、コールバック関数のパラメータの形式で返されます。

構文は次のとおりです。

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

パラメータ

パラメータは以下のとおりです。

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

オプション:オブジェクトが指定できます。

  • 現在の作業ディレクトリCWD、文字列、子プロセス
  • ENV、主要な環境変数のオブジェクト
  • エンコーディング、文字列、文字エンコーディング(デフォルト: 'UTF8')
  • シェルは、コマンドシェル(デフォルト実行する文字列、:UNIX上では、 /bin/shのWindowsのように、 cmd.exe 、シェルは識別することができるはず-cまたは、UNIXでスイッチを/s /c Windowsで。 Windowsで、コマンドラインの解析には、互換性がcmd.exe
  • タイムアウト、デジタル、タイムアウト(デフォルト:0)
  • 子供が越えて殺されるので、もしmaxBufferは、デジタル、標準出力や標準エラー出力の最大バッファは、(バイナリ)が存在することが許可されています(デフォルト:* 1024 200)
  • killSignal、文字列の終了信号(デフォルト: 'SIGTERM')
  • UIDは、デジタル、プロセスのユーザIDを設定します
  • GID、デジタル、設定プロセスグループID

コールバック:コールバック関数は3引数エラー、stdoutとstderrを持っています。

exec()メソッドは、最大バッファを返し、一時間はバッファの内容を返す、プロセスの終了を待ちます。

のは、2つの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,
      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: 

スポーン()メソッド

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

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

パラメータ

パラメータは以下のとおりです。

コマンド:実行するコマンド

引数:配列の文字列パラメータの配列

オプションオブジェクト

  • 子プロセスのCWD文字列現在の作業ディレクトリ
  • envオブジェクト環境変数のキーと値のペア
  • stdioのアレイ| stdioの構成文字列のサブプロセス
  • ブール切り離さこの子は、プロセスグループのリーダーになります
  • プロセスのユーザIDを設定するためのUID番号
  • GID番号設定プロセスグループID

スポーン()メソッドは、大量のデータを返すためにプロセスで使用される、ストリーム(標準出力&標準エラー出力)を返します。 スポーン()は、応答を受信し始めたときに、プロセスいったん開始しました。

のは、2つの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.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

フォーク方法

child_process.forkは、構文は次のとおりである、スポーン()プロセスを作成する方法の特殊な形式です。

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

パラメータ

パラメータは以下のとおりです。

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

引数:配列の文字列パラメータの配列

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

  • 子プロセスのCWD文字列現在の作業ディレクトリ
  • envオブジェクト環境変数のキーと値のペア
  • execPath文字列は、実行可能ファイルの子プロセスを作成します
  • String型のパラメータ配列execArgvアレイ子の実行可能ファイル(デフォルト:process.execArgv)
  • サイレントブール場合はtrue 、子供のstdinstdoutstderr親プロセスにリンクされます、それ以外の場合は、親プロセスから継承されます。 (デフォルト: false
  • プロセスのユーザIDを設定するためのUID番号
  • GID番号設定プロセスグループID

すべてのメソッドに加えて、返されるオブジェクトは子プロセスのインスタンスを持って、内蔵の通信チャネルがあります。

H3>例

のは、2つの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