マルチプロセスに関する知識は豊富で、Processモジュールを書く際にも触れられていましたが、理解するのはそれほど難しくないことがわかりました。この記事では、node.jsを使用した子プロセスの作成方法に関する関連情報を中心に紹介します。必要な方は参考にしていただければ幸いです。
前書き
Node 自体は単一プロセスであり、マルチコア CPU 上の単一プロセスのリソースの無駄を解決するためにドライバー モードを使用します。複数の子プロセスを作成します。
Node.js はシングルスレッドなので、マルチプロセッサ マシンにとっては無駄です。どのように使用できますか?そこで、child_process モジュールが登場しました。 child_process モジュールは、他のプロセスを生成、フォークし、作業を実行できます。
child_process モジュールは、親プロセスから子プロセスへのアクセスの表現として使用できる新しいクラス ChildProcess を提供します。 Process モジュールも ChildProcess オブジェクトです。親モジュールからプロセスにアクセスする場合、それは親の ChildProcess オブジェクトです。子プロセスからプロセスにアクセスする場合、それは ChildProcess オブジェクトです。オブジェクトを理解することは、イベント、メソッド、プロパティにすぎません。 ChildProcess についても同様です。
各子プロセスには常に、child.stdin、child.stdout、child.stderr の 3 つのストリーム オブジェクトがあります。これらは、親プロセスの stdio ストリームを共有する場合があります。
ここではまず、child_processモジュールのexec、spawn、forkの3つのメソッドを使って子プロセスを操作する方法を紹介します。
node-childProcessファイルを作成し、その中にnode-childPro.jsファイルを作成します。
1 行のコードは次のとおりです:
console.log("进程 " + process.argv[2] + " 执行。" ); //换成下面的查看process.argv //console.log("进程 " + process.argv + " 执行。" );
exec() メソッドnode-childProcess ファイル内に新しい node-childPro-exec.js ファイルを作成します。次のようなコード:
const fs = require('fs'); const child_process = require('child_process'); for (var i = 0; i < 3; i++) { //这里有空格请注意。分别代表node路径 node-childPro.js路径 i第几个进程。 node-childPro.js中的process.argv可以获取这些信息值 var childProcess = child_process.exec('node node-childPro.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); }); childProcess.on('exit', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
ターミナル実行コードの結果は次のとおりです:
G:\node\node-childProcess> node node-childPro-exec.js 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
spawn() メソッド 新しいノードを作成します-チャイルドプロ- node-childProcess ファイル内の spawn.js 。コードは次のとおりです。
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var childProcess = child_process.spawn('node', ['node-childPro-spawn.js', i]); childProcess.stdout.on('data', function (data) { console.log('stdout: ' + data); }); childProcess.stderr.on('data', function (data) { console.log('stderr: ' + data); }); childProcess.on('close', function (code) { console.log('子进程已退出,退出码 '+code); }); }
ターミナルでコードを実行した結果は次のとおりです。
G:\node\node-childProcess> node node-childPro-spawn.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 stdout: 进程 2 执行。 子进程已退出,退出码 0 子进程已退出,退出码 0
fork() メソッドnode-childProcess ファイル Pro-fork.js に新しいノードの子を作成します。コードは次のとおりです:
const fs = require('fs'); const child_process = require('child_process'); for(var i=0; i<3; i++) { var childProcess = child_process.fork("node-childPro.js", [i]); childProcess.on('close', function (code) { console.log('子进程已退出,退出码 ' + code); }); }
ターミナルの実行コードの結果は次のとおりです。
G:\node\node-childProcess> node node-childPro-fork.js 进程 0 执行。 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0 子进程已退出,退出码 0
exec、spawn、forkについて 1. exec関数はスポーンフレンドリーなカプセル化の一種で、シェルコマンド解析を追加し、複雑なコマンドを直接埋め込むことができます
2. exec 関数はサブプロセスの出力をキャッシュし、コールバック関数のパラメーターの形式でサブプロセスの出力を返します
3. 子スレッドでスポーンが開始されます 実行後、子スレッドから継続的にデータを返し始めますプロセスからメインプロセスへ (「システム監視」などのアプリケーションシナリオ) 4.spawn はコールバック関数をサポートしていません。ストリームを通じてメインプロセスにデータを送信するため、複数のプロセス間のデータ交換を実現します
5. fork( ) は spawn() の特殊なケースであり、ノード プロセスを派生するために使用されます。通常の ChildProcess インスタンスのすべてのメソッドに加えて、返されるオブジェクトには組み込みの通信チャネルもあります。
もう学びましたか?急いで試してみてください。
PHP と Node.js
以上がNode.js を使用して子プロセスを作成する方法を説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。