ホームページ >ウェブフロントエンド >jsチュートリアル >Node.js の子プロセスとアプリケーションの概要

Node.js の子プロセスとアプリケーションの概要

不言
不言オリジナル
2018-06-30 14:57:151472ブラウズ

この記事では主に Node.js のサブプロセスとアプリケーション シナリオについて簡単に説明します。内容は非常に優れているので、参考として共有します。

背景

ons (Alibaba Cloud RocketMQ パッケージ) は C++ に基づいてカプセル化されているため、単一プロセスでの複数のプロデューサーとコンシューマーのインスタンス化をサポートしていません。この問題を解決するには、Node.js の子を使用します。使用されるプロセスです。

使用中に遭遇する落とし穴

リリース: プロセス管理がメインプロセスを閉じた後、サブプロセスはオペレーティングシステムプロセスになります(pidは1)

いくつかの解決策

サブプロセスを独立して実行されているプロセスとして扱う、pidを記録し、公開時にプロセス管理を行い、メインプロセスを閉じると同時にサブプロセスを閉じます

メインプロセスはシャットダウンイベントをリッスンし、それ自体に属するサブプロセスを積極的に閉じます

タイプサブプロセスの

  1. spawn: コマンドの実行

  2. exec: コマンドの実行(新しいシェル)

  3. execFile: ファイルの実行

  4. fork: ファイルの実行

子供向けの一般的なイベントプロセス

  1. exit

  2. close close と exit には違いがあります。 close はデータ ストリームが閉じられるときにトリガーされるイベントであり、exit は子プロセスが終了するときにトリガーされるイベントです。複数の子プロセスが同じデータ ストリームを共有できるため、現時点では他の子プロセスがデータ ストリームを使用しているため、子プロセスの終了時に close イベントが必ずしもトリガーされるとは限りません。

  3. サブプロセスのデータフロー

  4. stdin

stdout

stderr

  1. メインプロセスが開始点であるため、サブプロセスのデータフローは逆方向になります従来理解されているデータ フローに、stdin: 書き込みストリーム、stdout、stderr: 読み取りストリームを適用します。

  2. spawn

  3. spawn(command[, args][, options])

  4. コマンドを実行し、データ データ ストリームを通じてさまざまな実行結果を返します。

基本的な使用法

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(); を呼び出すと、子プロセスは実際に独立して実行を開始し、メイン プロセスは独立して終了できます。

exec

exec(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}`);
});

execFile

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

  1. 以上がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

  2. 関連する推奨事項:
  3. ファイル検索範囲を狭めるための Webpack 最適化構成の概要
  4. HTTP プロトコル要求を処理するための Node.js の Request モジュールの使用の概要

Node.js でのカスタム エラー タイプの解析

以上がNode.js の子プロセスとアプリケーションの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。