この記事では主に Node.js のサブプロセスとアプリケーション シナリオについて簡単に説明します。内容は非常に優れているので、参考として共有します。
背景
ons (Alibaba Cloud RocketMQ パッケージ) は C++ に基づいてカプセル化されているため、単一プロセスでの複数のプロデューサーとコンシューマーのインスタンス化をサポートしていません。この問題を解決するには、Node.js の子を使用します。使用されるプロセスです。
使用中に遭遇する落とし穴
リリース: プロセス管理がメインプロセスを閉じた後、サブプロセスはオペレーティングシステムプロセスになります(pidは1)
いくつかの解決策
サブプロセスを独立して実行されているプロセスとして扱う、pidを記録し、公開時にプロセス管理を行い、メインプロセスを閉じると同時にサブプロセスを閉じます
メインプロセスはシャットダウンイベントをリッスンし、それ自体に属するサブプロセスを積極的に閉じます
タイプサブプロセスの
spawn: コマンドの実行
exec: コマンドの実行(新しいシェル)
execFile: ファイルの実行
fork: ファイルの実行
子供向けの一般的なイベントプロセス
exit
close close と exit には違いがあります。 close はデータ ストリームが閉じられるときにトリガーされるイベントであり、exit は子プロセスが終了するときにトリガーされるイベントです。複数の子プロセスが同じデータ ストリームを共有できるため、現時点では他の子プロセスがデータ ストリームを使用しているため、子プロセスの終了時に close イベントが必ずしもトリガーされるとは限りません。
stdin
stdout
stderr
メインプロセスが開始点であるため、サブプロセスのデータフローは逆方向になります従来理解されているデータ フローに、stdin: 書き込みストリーム、stdout、stderr: 読み取りストリームを適用します。
spawn(command[, args][, options])
const { spawn } = require('child_process'); const child = spawn('find', [ '.', '-type', 'f' ]); child.stdout.on('data', (data) => { console.log(`child stdout:\n${data}`); }); child.stderr.on('data', (data) => { console.error(`child stderr:\n${data}`); }); child.on('exit', (code, signal) => { console.log(`child process exit with: code $[code], signal: ${signal}`); });
共通パラメータ
{ cwd: String, env: Object, stdio: Array | String, detached: Boolean, shell: Boolean, uid: Number, gid: Number }
子プロセスが独立して実行されるように準備するために、Detached 属性に焦点を当てます。子プロセスの特定の動作はオペレーティング システムに関連しており、Windows システムの子プロセスには独自のコンソール ウィンドウがあり、POSIX システムの子プロセスが新しいプロセス グループおよびセッション リーダーになります。
現時点では、子プロセスは完全に独立しているわけではなく、子プロセスの実行結果はメインプロセスが設定したデータストリームに表示され、メインプロセスの終了は子プロセスの動作に影響を与えます。 stdio を無視するように設定し、child.unref(); を呼び出すと、子プロセスは実際に独立して実行を開始し、メイン プロセスは独立して終了できます。
execexec(command[, options][, callback])
コマンドを実行し、コールバックパラメータを通じて結果を返します。 コマンドが実行されない場合、結果の一部はシステムメモリにキャッシュされます。
const { exec } = require('child_process'); exec('find . -type f | wc -l', (err, stdout, stderr) => { if (err) { console.error(`exec error: ${err}`); return; } console.log(`Number of files ${stdout}`); });
両方の長所 - exec を spawn に置き換えます
exec の結果は一度返され、返される前にメモリにキャッシュされるため、実行されたシェル コマンドの出力が大きすぎる場合は、exec を使用してください現時点では、コマンド メソッドでは期待どおりに作業を完了できません。exec の代わりに spawn を使用してシェル コマンドを実行できます。
const { spawn } = require('child_process'); const child = spawn('find . -type f | wc -l', { stdio: 'inherit', shell: true }); child.stdout.on('data', (data) => { console.log(`child stdout:\n${data}`); }); child.stderr.on('data', (data) => { console.error(`child stderr:\n${data}`); }); child.on('exit', (code, signal) => { console.log(`child process exit with: code $[code], signal: ${signal}`); });
child_process.execFile(file[, args][, options][, callback])
ファイルを実行する
この関数は、指定されたパスでスクリプト ファイルを実行し、代わりに新しいプロセスを直接作成する点を除いて、基本的に exec と同じです。シェル環境を作成してからスクリプトを実行すると、比較的軽量で効率的になります。ただし、Windows システムでは、.cmd や .bat などのファイルを直接実行することはできません。つまり、代わりに execFile を使用できます。
fork
child_process.fork(modulePath[, args][, options])
Node.jsファイルを実行する
// parent.js const { fork } = require('child_process'); const child = fork('child.js'); child.on('message', (msg) => { console.log('Message from child', msg); }); child.send({ hello: 'world' });
// child.js process.on('message', (msg) => { console.log('Message from parent:', msg); }); let counter = 0; setInterval(() => { process.send({ counter: counter++ }); }, 3000);
forkは実際には特別な形式のスポーンであり、固定されたスポーンNode.jsプロセスです、そしてマスターでプロセス間に通信チャネルが確立され、マスター プロセスと子プロセスがプロセス モジュールを使用してイベントに基づいて通信できるようになります。
サブプロセスの使用シナリオコンピューティング集約型システム
フロントエンド建設ツールはマルチコアCPU並列コンピューティングを使用して建設効率を向上させます
次のようなプロセス管理ツール: いくつかの機能in PM2
以上がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
以上がNode.js の子プロセスとアプリケーションの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。