Nodejs-scaling-application
Node.js-スケーリングアプリケーション
Node.jsはシングルスレッドモードで実行されますが、同時実行を処理するためにイベント駆動型のパラダイムを使用します。 また、子プロセスの作成を容易にし、マルチコアCPUベースのシステムでの並列処理を活用します。
子プロセスには、常に3つのストリーム child.stdin 、 child.stdout 、および child.stderr があり、親プロセスのstdioストリームと共有できます。
Nodeは、子プロセスを作成する次の3つの主要な方法を持つ child_process モジュールを提供します。
- exec -child_process.execメソッドは、シェル/コンソールでコマンドを実行し、出力をバッファリングします。
- spawn -child_process.spawnは、指定されたコマンドで新しいプロセスを起動します。
- fork -child_process.forkメソッドは、子プロセスを作成するspawn()の特殊なケースです。
exec()メソッド
child_process.execメソッドは、シェルでコマンドを実行し、出力をバッファリングします。 次の署名があります-
child_process.exec(command[, options], callback)
パラメーター
ここに使用されるパラメータの説明があります-
- command (文字列)スペースで区切られた引数を使用して実行するコマンド
- オプション(オブジェクト)は、次のオプションの1つ以上を含むことがあります-
- cwd (文字列)子プロセスの現在の作業ディレクトリ
- env (オブジェクト)環境のキーと値のペア
- encoding (String)(デフォルト: 'utf8')
- shell (文字列)コマンドを実行するシェル(デフォルト:UNIXでは「/bin/sh」、Windowsでは「cmd.exe」、シェルはUNIXの-cスイッチまたはWindowsの/s/cを理解する必要があります。 Windowsでは、コマンドライン解析はcmd.exeと互換性があります。
- timeout (数値)(デフォルト:0)
- maxBuffer (数値)(デフォルト:200 * 1024)
- killSignal (文字列)(デフォルト: 'SIGTERM')
- uid (数値)プロセスのユーザーIDを設定します。
- gid (数値)プロセスのグループIDを設定します。
- callback この関数は、プロセスの終了時に出力とともに呼び出される3つの引数 error 、* stdout、、および *stderr を取得します。
exec()メソッドは、最大サイズのバッファを返し、プロセスが終了するまで待機し、バッファされたすべてのデータを一度に返そうとします。
例
support.jsとmaster.jsという2つのjsファイルを作成しましょう-
- ファイル:support.js *
console.log("Child Process " + process.argv[2] + " executed." );
- ファイル: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('Child process exited with exit code '+code);
});
}
今、master.jsを実行して結果を確認します-
$ node master.js
出力を確認します。 サーバーが起動しました。
Child process exited with exit code 0
stdout: Child Process 1 executed.
stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.
stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.
spawn()メソッド
child_process.spawnメソッドは、指定されたコマンドで新しいプロセスを起動します。 次の署名があります-
child_process.spawn(command[, args][, options])
パラメーター
ここに使用されるパラメータの説明があります-
- command (文字列)実行するコマンド
- args (配列)文字列引数のリスト
- オプション(オブジェクト)は、次のオプションの1つ以上を含むことがあります-
- cwd (文字列)子プロセスの現在の作業ディレクトリ。
- env (オブジェクト)環境のキーと値のペア。
- stdio (配列)文字列子のstdio設定。
- customFds (配列)stdioで使用する子の非推奨ファイル記述子。
- detached (ブール値)子はプロセスグループリーダーになります。
- uid (数値)プロセスのユーザーIDを設定します。
- gid (数値)プロセスのグループIDを設定します。
spawn()メソッドはストリーム(stdout&stderr)を返します。プロセスが大量のデータを返す場合に使用する必要があります。 spawn()は、プロセスの実行が開始されるとすぐに応答の受信を開始します。
例
support.jsおよびmaster.jsという名前の2つのjsファイルを作成します-
- ファイル:support.js *
console.log("Child Process " + process.argv[2] + " executed." );
- ファイル: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('child process exited with code ' + code);
});
}
今、master.jsを実行して結果を確認します-
$ node master.js
出力を確認します。 サーバーが起動しました
stdout: Child Process 0 executed.
child process exited with code 0
stdout: Child Process 1 executed.
stdout: Child Process 2 executed.
child process exited with code 0
child process exited with code 0
fork()メソッド
child_process.forkメソッドは、Nodeプロセスを作成するspawn()の特殊なケースです。 次の署名があります-
child_process.fork(modulePath[, args][, options])
パラメーター
ここに使用されるパラメータの説明があります-
- modulePath (文字列)子で実行するモジュール。
- args (配列)文字列引数のリスト
- オプション(オブジェクト)は、次のオプションの1つ以上を含むことがあります-
- cwd (文字列)子プロセスの現在の作業ディレクトリ。
- env (オブジェクト)環境のキーと値のペア。
- execPath (文字列)子プロセスの作成に使用される実行可能ファイル。
- execArgv (配列)実行可能ファイルに渡される文字列引数のリスト(デフォルト:process.execArgv)。
- silent (ブール値)trueの場合、子のstdin、stdout、およびstderrは親にパイプされます。そうでない場合は、親から継承されます。spawn()の「パイプ」および「継承」オプションを参照してください。詳細についてはstdio(デフォルトはfalse)。
- uid (数値)プロセスのユーザーIDを設定します。
- gid (数値)プロセスのグループIDを設定します。
forkメソッドは、通常のChildProcessインスタンスにすべてのメソッドを含めることに加えて、組み込みの通信チャネルを持つオブジェクトを返します。
例
support.jsおよびmaster.jsという名前の2つのjsファイルを作成します-
- ファイル:support.js *
console.log("Child Process " + process.argv[2] + " executed." );
- ファイル: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('child process exited with code ' + code);
});
}
今、master.jsを実行して結果を確認します-
$ node master.js
出力を確認します。 サーバーが起動しました。
Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0