web-dev-qa-db-ja.com

node.js子プロセス-spawnとforkの違い

これは基本的な質問のように思えるかもしれませんが、ドキュメントを見つけることができませんでした:

Node.jsプロセスの分岐と生成の違いは何ですか?フォークは産卵の特別なケースであると読んだことがありますが、それぞれを使用するための異なるユースケース/反論は何ですか?

126
Hitesh

Spawnは、システムコマンドを実行するために設計されたコマンドです。 spawnを実行すると、独自のプロセスで実行されるシステムコマンドが送信されますが、ノードプロセス内でそれ以上のコードは実行されません。生成したプロセスにリスナーを追加して、生成されたプロセスとコードが対話できるようにすることができますが、新しいV8インスタンスは作成されません(もちろん、コマンドが別のNodeコマンドである場合を除き、 fork!を使用する必要があります。ノードモジュールの1つのコピーのみがプロセッサでアクティブになります。

Forkはspawnの特別なインスタンスであり、V8エンジンの新しいインスタンスを実行します。つまり、本質的に複数のワーカーを作成し、まったく同じNodeコードベース、または特定のタスク用の異なるモジュールで実行できます。これは、ワーカープールの作成に最も役立ちます。ノードの非同期イベントモデルでは、マシンのシングルコアをかなり効率的に使用できますが、ノードプロセスでマルチコアマシンを使用することはできません。これを実現する最も簡単な方法は、単一のプロセッサで同じプログラムの複数のコピーを実行することです。

良い経験則は、コアあたり1つから2つのノードプロセスです。おそらく、ラムクロック/ CPUクロック比が良好なマシンや、I/Oが重くCPU作業が軽いノードプロセスでは、イベントのダウンタイムを最小限に抑えるために、ループは新しいイベントを待っています。ただし、後者の提案はマイクロ最適化であり、多くのプロセス/コアのニーズに合わせて状況を確認するには、慎重なベンチマークが必要です。実際には、マシン/シナリオに対して大量のワーカーを生成することにより、パフォーマンスを低下させることができます。

最終的には、spawnにNodeコマンドを送信することで、上記の方法でspawnを使用できます。しかし、forkはV8インスタンスの作成プロセスを最適化するためにいくつかのことを行うため、これはばかげています。明確にするだけで、最終的に生成されるのはフォークです。フォークは、この特定の非常に便利なユースケースに最適です。

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

193
ChrisCM
  • spawn-child_process.spawnは、指定されたコマンドで新しいプロセスを起動します。
  • fork-child_process.forkメソッドは、spawn()子プロセスを作成します。

Spawn()メソッド

child_process.spawnメソッドは、指定されたコマンドで新しいプロセスを起動します。次の署名があります-

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

オプション の詳細を読む

Spawn()メソッドはストリーム(stdout&stderr)を返します。プロセスが大量のデータを返す場合に使用する必要があります。 spawn()は、プロセスの実行が開始されるとすぐに応答の受信を開始します。

Fork()メソッド

child_process.forkメソッドは、spawn()の特殊なケースですNodeプロセス。次の署名があります-

 child_process.fork(modulePath[, args][, options])

Forkメソッドは、すべてのメソッドを通常のChildProcessインスタンスに含めることに加えて、組み込みの通信チャネルを持つオブジェクトを返します。

4

TLDR

スポーン

spawnが作成されると-親プロセスと子プロセスの間にストリーミングインターフェイスが作成されます。

ストリーミングインターフェイス手段-バイナリ形式のデータのバッファリング

フォーク

forkが作成された場合-親プロセスと子プロセスの間に通信チャネルを作成します

通信チャネルの意味-メッセージング

両方とも同じデータ転送を行うように見えますが、以下の違いを除きます

spawnは、やりたいときに便利です連続的な種類の操作ストリームでのデータの読み書きのように

forkは、やりたいときに便利ですmessaging

結論

spawnに使用する必要がありますストリーミングビッグデータ/ファイル/イメージFROM spawnプロセスTO プロセス

forkは、メッセージングの実行に使用する必要があります。

  • Eg 10個のforkプロセスが親から作成されたとします。
  • 各プロセスは何らかの操作を実行します
  • 操作を完了する各プロセスは、親にメッセージを送信します 'process no.4 done'、 'process no。 8完了 '
1
vijay