English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
私たちはNode.jsが単一スレッドのモードで動作することを知っていますが、彼はイベント駆動で並行処理を処理するため、多核心CPUのシステム上で複数の子プロセスを作成し、パフォーマンスを向上させるのに役立ちます。
各子プロセスは常に3つのストリームオブジェクトを持ちます:child.stdin、child.stdout、child.stderr。彼らは親プロセスのstdioストリームを共有するか、独立した被導流のストリームオブジェクトになることがあります。
Nodeはchild_processモジュールを提供し、子プロセスを作成するための方法があります:
exec - child_process.execは子プロセスでコマンドを実行し、子プロセスの出力をキャッシュし、子プロセスの出力をコールバック関数の引数として返します。
spawn - child_process.spawnは指定されたコマンドラインパラメータを使用して新しいプロセスを作成します。
fork}} - child_process.forkはspawn()の特別な形式であり、fork('./son.js') は spawn('node', ['.',/son.js') は、spawnメソッドとは異なり、forkは親プロセスと子プロセス間に通信パイプを構築し、プロセス間の通信に使用されます。
child_process.execは子プロセスでコマンドを実行し、子プロセスの出力をキャッシュし、子プロセスの出力をコールバック関数の引数として返します。
以下のようになります:
child_process.exec(command[, options], callback)
以下の通りにパラメータを説明します:
command: 文字列、実行するコマンド、引数はスペースで区切ります
options :オブジェクト、以下のものができます:
cwd 、文字列、子プロセスの現在の作業ディレクトリ
env、オブジェクト 環境変数のキー値ペア
encoding、文字列、文字コード(デフォルト: 'utf8)
shell、文字列、実行するコマンドのShell(デフォルト: UNIXで/bin/sh、Windowsではcmd.exe、Shellは認識する必要があります -c スイッチは UNIXで、または /s /c は Windows で。Windowsでは、コマンドラインの解析はcmd.exeと互換性を持たなければなりません)
timeout、数字、タイムアウト時間(デフォルト: 0)
maxBuffer、数字、stdoutまたはstderrに存在できる最大バッファ(バイナリ)(デフォルト: 200*1024)
killSignal、文字列、終了シグナル(デフォルト:'SIGTERM')
uid、数字、ユーザープロセスのIDを設定します
gid、数字、プロセスグループのIDを設定します
callback :コールバック関数は、error、stdout、stderrの3つの引数を含みます。
exec() メソッドは最大のバッファを返し、プロセスが終了を待ち、一度にバッファの内容を返します。
次に、2つのjsファイル support.js と master.js を作成しましょう。
console.log("プロセス " + process.argv[2] + " 実行。" );
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])
以下の通りにパラメータを説明します:
command: 実行するコマンド
args: Array 文字列パラメータ配列
options Object
cwd String 子プロセスの現在の作業ディレクトリ
env Object 環境変数のキー値ペア
stdio Array|String サブプロセスの stdio 設定
detached Boolean このサブプロセスはプロセスグループのリーダーになります
uid Number ユーザープロセスのIDを設定
gid Number プロセスグループのIDを設定
spawn() メソッドは、プロセスが大量のデータを返す場合に使用されるストリーム (stdout & stderr) を返します。spawn() が実行を開始すると、プロセスが応答を受信し始めます。
次に、2つのjsファイル support.js と master.js を作成しましょう。
console.log("プロセス " + process.argv[2] + " 実行。" );
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 は spawn() メソッドの特別な形式であり、プロセスの作成に使用されます。以下の形式で構文されています:
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の例の全てのメソッドを持ち、内蔵の通信チャンネルがあります。
次に、2つのjsファイル support.js と master.js を作成しましょう。
console.log("プロセス " + process.argv[2] + " 実行。" );
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