English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS 基礎チュートリアル

NodeJS Express.js

NodeJS バッファー&URL;

NodeJS MySql

NodeJS MongoDB

NodeJS ファイル(FS)

NodeJS その他

Node.js 多进程

私たちは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は親プロセスと子プロセス間に通信パイプを構築し、プロセス間の通信に使用されます。

exec() メソッド

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 を作成しましょう。

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])

パラメータ

以下の通りにパラメータを説明します:

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 を作成しましょう。

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: 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 を作成しましょう。

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