Node には複数のスレッドがありますが、v8 で実行される JavaScript はシングルスレッドです。ノードの child_process モジュールは子プロセスの作成に使用され、子プロセスを通じて CPU を最大限に活用できます。例:
フォークを含むプロセスの作成方法をいくつか示します:
1.spawn(command, [args], [options])、コマンド command を実行するための新しいプロセスを開始します。args はコマンド ライン パラメーターです
2.exec(command, [options], callback)、コマンド command を実行する新しいプロセスを開始します。コールバックは、プロセス終了時に標準入力、標準出力、およびエラー情報を取得するために使用されます
3.execFile(file, [args], [options], [callback])、実行可能ファイル file を実行するための新しいプロセスを開始します。コールバックは、プロセス終了時に標準入力、標準出力、およびエラー情報を取得するために使用されます
4.fork(modulePath, [args], [options])、JavaScript ファイルモジュールを実行する新しいプロセスを開始し、この時点で Node の子プロセスが作成されます
ノードプロセス間通信
親プロセス
子プロセス
ここでの送信メソッドは同期であるため、大量のデータを送信することはお勧めできません (代わりにパイプを使用できます。詳細については、http://nodejs.org/api/ を参照してください)。すべて。html#child_process_child_process_spawn_command_args_options)。
特殊なケースでは、メッセージ内の cmd 属性値に NODE_ プレフィックスが含まれている場合 (例: {cmd: 'NODE_foo'} メッセージ)、このメッセージはメッセージ イベント (ただし、internalMessage イベント) には送信されません。 Node によって内部的に使用されます。
send メソッドのプロトタイプは次のとおりです:
ここで、sendHandle(handle) を使用して送信できます:
1.net.Native、ネイティブ C TCP ソケットまたはパイプ
2.net.Server、TCP サーバー
3.net.Socket、TCPソケット
4.dgram.Native、ネイティブ C UDP ソケット
5.dgram.Socket、UDP ソケット
send が sendHandle を送信する場合、実際には JavaScript オブジェクトを直接送信しません (また送信できません)。ただし、ファイル記述子は送信されます (最終的には JSON 文字列として送信されます)。他のプロセスはこのファイル記述子を使用して、対応するオブジェクトを復元できます。
次に例を見てみましょう:
親プロセス
子プロセス
ポート 7000 経由でこのプログラムにアクセスすると、出力は接続 - 親または接続 - 子になります。ここでは、子プロセスと親プロセスが同時にポート 7000 で待機しています。一般に、同じポートをリッスンする複数のプロセスにより EADDRINUSE 例外が発生します。この場合、2 つの異なるプロセスが同じファイル記述子を使用し、ノードの最下位層がポートでリッスンするときにソケットに SO_REUSEADDR オプションを設定します。このソケットをさまざまなプロセス間で再利用できるようにします。複数のプロセスが同じポートをリッスンする場合、ファイル記述子を同時に使用できるのは 1 つのプロセスのみであり、これらのプロセスによるソケットの使用はプリエンプティブになります。
クラスターモジュール
クラスター モジュールは Node v0.8 で追加されました。クラスター モジュールを使用すると、物理マシン上で同じポートをリッスンするプロセスのグループを簡単に構築できます。例:
ワーカープロセスで listen メソッドを呼び出します。listen リクエストはマスタープロセスに渡されます。マスター プロセスにワーカー プロセスの要件を満たすリスニング サーバーがすでに存在する場合、このサーバーのハンドルがワーカーに渡されます。存在しない場合は、マスター プロセスがワーカー プロセスを作成し、そのハンドルをワーカーに渡します。ワーカープロセス。
クラスターに関する詳細なドキュメント: http://www.nodejs.org/api/cluster.html