Node.js で子プロセスを作成する方法

Node Js De Zipurosesuwo Zuo Chengsuru Fang Fa



「」でプログラミングしているとき ノード.js 」というように、増加するアプリケーションのワークロードに単一のプロセスで対処するのは決して効率的ではありません。したがって、開発者が新しいプロセスを作成し、長期的なタスクを処理し、オペレーティング システムとの対話を可能にする必要がある特定の状況が発生する可能性があります。これは、複数のプロセスを使用する子プロセスを作成し、それによって Node アプリケーションをスケーリングすることによって実現できます。

この記事では、以下の内容について説明します。







子プロセスとは何ですか?

子プロセスは、別のプロセス、つまり親プロセスを介して作成されたプロセスに対応します。 Node.js が提供するのは「 子プロセス 」モジュールは、子プロセス間の効果的な通信を保証します。また、このモジュールは、子プロセス内でシステム コマンドを実行することにより、オペレーティング システム機能の呼び出しを支援します。



Node.jsで子プロセスを作成するにはどうすればよいですか?

子は「」で処理します。 ノード.js 」は、以下のアプローチで作成できます。



  • スポーン() ' 方法。
  • フォーク() ' 方法。
  • 実行() ' 方法。
  • execFile() ' 方法。

アプローチ 1: 「spawn()」メソッドを使用してnode.jsで子プロセスを作成する

スポーン() 」メソッドは、提供されたコマンドレットとコマンド ライン引数を利用して、新しいプロセスでコマンドレットを生成します。 ChildProcess インスタンスは、子オブジェクトのイベントのハンドラーを登録できる EventEmitter API を適用/実装します。これらのイベントには、終了、切断、エラー、メッセージ、クローズが含まれます。





構文

子プロセス。 スポーン ( コマンドレット [ 、引数 [ 、オプション )

この構文では次のようになります。



  • コマンドレット: 実行するコマンドレットである文字列を受け取ります。
  • 引数: これは文字列引数リストを参照します。デフォルト値は null 配列です。
  • オプション 」はブール値を取る「シェル」にすることができます。 「」である場合、それはそのようなものです 真実 」と指定すると、コマンドレットがシェル内から実行されます。デフォルト値は「 間違い 」 これはシェルがないことを意味します。デフォルトでは、「 スポーン() 」はコマンドレットを実行するためのシェルを作成/生成しないため、子プロセスにアクセスする際にコマンドレットを「オプション」として渡すことが重要です。

戻り値: このメソッドは ChildProcess オブジェクトを取得します。

以下は、子プロセスの作成のデモです。

定数 { スポーン } = 必要とする ( '子プロセス' ) ;

定数 子供 = スポーン ( 'あなた' [ 'D: \S エトゥプス ] { シェル : 真実 } ) ;

子供。 標準出力 の上 ( 'データ' ( データ ) => {

コンソール。 ログ ( `標準出力 : $ { データ } ` ) ;

} ) ;

子供。 標準エラー の上 ( 'データ' ( データ ) => {

コンソール。 エラー ( `標準エラー : $ { データ } ` ) ;

} ) ;

子供。 の上 ( '近い' ( コード ) => {

コンソール。 ログ ( `子プロセスはコード$で終了しました { コード } ` ) ;

} ) ;

このコード ブロックでは次のようになります。

  • まず、「」を含めます。 子プロセス ” 子プロセスを作成するためのモジュール。
  • その後、指定されたパスのコンテンツを表示するための子プロセスを生成します。つまり、「 D:\セットアップ ”。
  • 最後に、「 近い 」イベントは、子プロセス全体が終了し、コンソールに終了メッセージが表示されるときに呼び出されます。

出力

ここで、次のコマンドレットを実行してコードを実行し、ターゲット パスの内容を表示します。

ノード温度 js

アプローチ 2: 「fork()」メソッドを使用してnode.jsで子プロセスを作成する

このメソッドは「」に関連付けられています。 スポーン() 」メソッドを使用すると、子プロセスと親プロセス間の通信を「 送信() ' 方法。

フォーク() 」メソッドは、複雑な計算タスクをイベント ループ (メイン) から分離します。このメソッドは複数の子プロセスにアクセスするために使用できますが、各プロセスには独自のメモリがあるため、全体のパフォーマンスに影響を与える可能性があります。

構文

子プロセス。 フォーク ( mdパス [ 、引数 [ 、オプション ] )

この構文によれば、次のようになります。

  • mdパス ” は、子で実行するモジュールを表す文字列を受け取ります。
  • 引数 ” は文字列引数リストを指します。
  • オプション 」には、「execPath」、「env」、「CWD」、「detached」、「execArgv」を指定できます。

戻り値: このメソッドは ChildProcess インスタンスを取得します。

コード(親プロセス)

次に、以下のコード ブロックを実行して、「 送信() ' 方法:

定数 CP = 必要とする ( '子プロセス' ) ;

子供にさせてください = CP。 フォーク ( __ディレクトリ名 + '/fork2.js' ) ;

子供。 の上 ( 'メッセージ' 、 関数 ( バツ ) {

コンソール。 ログ ( 「親プロセスが取得したもの:」 、 バツ ) ;

} ) ;

子供。 送信 ( { こんにちは : 「親プロセスから」 } ) ;

子供。 の上 ( '近い' ( コード ) => {

コンソール。 ログ ( `子プロセスはコード$で終了しました { コード } ` ) ;

} ) ;

このコードでは:

  • 同様に、「」を組み込みます。 子プロセス ” 子プロセスを作成するためのモジュール。
  • ここで、「」経由で子プロセスのパスを指定します。 フォーク() ' 方法。
  • 最後に、「」経由で親プロセスを表すメッセージを表示します。 送信() 」メソッドを実行し、発生したエラーがある場合はそれを表示します。

コード(子プロセス)

次のコード ファイル、つまり「 fork2.js ” は、” を利用してメッセージを送信する子プロセスも表します。 送信() 」メソッドは次のようになります。

プロセス。 の上 ( 'メッセージ' 、 関数 ( メートル ) {

コンソール。 ログ ( 「子プロセスが取得したもの:」 、メートル ) ;

} ) ;

プロセス。 送信 ( { こんにちは : 「子プロセスから」 } ) ;

出力

次に、以下のコマンドレットを実行してコードを実行します。

ノードのフォーク子。 js

この出力により、親子プロセス通信が適切に行われていることが確認できます。

アプローチ 3: 「exec()」メソッドを使用してnode.jsで子プロセスを作成する

実行() 」メソッドは、最初にシェルを作成してから、コマンドレットを実行します。このメソッドは、ディレクトリ全体を取得するために使用されます。

構文

子プロセス。 実行する ( コマンドレット [ 、オプション [ 、 折り返し電話 )

指定された構文では次のようになります。

  • コマンドレット ” は、スペースで区切られた引数で実行するコマンドを表す文字列を受け取ります。
  • オプション 」には「cwd」「エンコーディング」「シェル」などが含まれます。
  • 折り返し電話 」関数は、プロセス/操作の終了時に呼び出されます。

戻り値

このメソッドは ChildProcess インスタンスを取得します。

次に、ディレクトリの数をリストするコードに進みます。

定数 { 実行する } = 必要とする ( '子プロセス' ) ;
実行する ( 'ディレクトリ | find /c /v ''' ( エラー、標準出力、標準エラー出力 ) => {
もし ( エラー ) {
コンソール。 エラー ( `実行エラー : $ { エラー } ` ) ;
戻る ;
}
コンソール。 ログ ( `標準出力 : 番号 ディレクトリの数 -> $ { 標準出力 } ` ) ;
もし ( 標準エラー != 「」 )
コンソール。 エラー ( `標準エラー : $ { 標準エラー } ` ) ;
} ) ;

このコード スニペットには、「 子プロセス 」モジュールを使用して子プロセスを作成/作成します。その後、直面した例外/エラーに対処し、現在の作業ディレクトリ内のディレクトリの総数を表示します。

出力

コードを実行するには、次のコードを実行します。

ノード実行子。 js

この出力では、現在の作業ディレクトリ内のディレクトリの合計が表示されていることを示唆できます。

アプローチ 4: execFile() メソッドを使用して、node.js で子プロセスを作成する

の中に ' execFile() 」メソッドでは、ターゲットの実行可能ファイルが新しいプロセスの形式で直接生成されるため、「」メソッドよりも効率的です。 実行() ' 方法。このメソッドは、作成された「 execchild.js ” ファイルを新しいプロセスの形式で作成します。

構文

子プロセス。 実行ファイル ( ファイル名 [ 、引数 [ 、オプション [ 、 折り返し電話 )

指定された構文では次のようになります。

  • ファイル名 」は、実行するファイルの名前またはパスを表す文字列を受け取ります。
  • 引数 ” は文字列引数リストに対応します。
  • オプション 」には「cwd」「エンコーディング」「シェル」などが含まれます。
  • 折り返し電話 」関数はプロセス終了時に呼び出されます。関数の引数には、error、stdout などを指定できます。

戻り値

このメソッドは ChildProcess インスタンスも取得します。

ここで、ターゲットの実行可能ファイルを新しいプロセスとして生成する次のコードを考えてみましょう。

定数 { 実行ファイル } = 必要とする ( '子プロセス' ) ;
定数 バツ = 実行ファイル ( 'ノード' [ 「execchild.js」
( エラー、標準出力、標準エラー出力 ) => {
もし ( エラー ) {
投げる エラー ;
}
コンソール。 ログ ( 標準出力 ) ;
} ) ;

これらのコード行に基づいて、次の手順を適用します。

  • 「」を含めるために説明した手順を繰り返します。 子プロセス 」モジュール。
  • 次のステップでは、「」を適用します。 execFile() 」メソッドは、指定された実行可能ファイル (前のアプローチで説明した) を新しいプロセスとして生成し、それによって作業ディレクトリ内のディレクトリの合計をリストします。

出力

以下のコマンドレットを実行してコードを実行します。

ノード実行ファイル。 js

この結果では、指定した実行ファイルが生成され、ディレクトリ数が表示されていることが確認できます。

結論

Node.js の子プロセスは、「 スポーン() ” メソッド、” フォーク() ” メソッド、” 実行() ” メソッド、または” execFile() ' 方法。これらのアプローチはそれぞれ、子プロセスを生成し、親子プロセス通信を有効にし、現在の作業ディレクトリ内のディレクトリを (直接またはターゲット実行可能ファイルの生成を介して) リストダウンします。