マルチプロセスを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
、子供のstdin
、stdout
とstderr
親プロセスにリンクされます、それ以外の場合は、親プロセスから継承されます。 (デフォルト: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