回答:
Spawnは、システムコマンドを実行するために設計されたコマンドです。spawnを実行すると、独自のプロセスで実行されるシステムコマンドが送信されますが、ノードプロセス内でそれ以上のコードは実行されません。スポーンしたプロセスのリスナーを追加して、コードがスポーンしたプロセスと対話できるようにすることができますが、新しいV8インスタンスは作成されません(もちろん、コマンドが別のノードコマンドでない限り、この場合はforkを使用してください)。ノードモジュールの1つのコピーのみがプロセッサでアクティブです。
フォークはspawnの特別なインスタンスで、V8エンジンの新しいインスタンスを実行します。つまり、実質的に同じNodeコードベースで実行する複数のワーカーを作成することも、特定のタスク用に異なるモジュールを作成することもできます。これは、ワーカープールを作成するのに最も役立ちます。ノードの非同期イベントモデルでは、マシンの単一コアをかなり効率的に使用できますが、ノードプロセスでマルチコアマシンを使用することはできません。これを実現する最も簡単な方法は、同じプログラムの複数のコピーを単一のプロセッサで実行することです。
目安としては、コアごとに1〜2つのノードプロセスを使用します。おそらく、RAMクロック/ CPUクロック比が良好なマシンの場合、またはイベントのダウンタイムを最小限に抑えるために、I / Oが重く、CPUの負荷が軽いノードプロセスの方が多いでしょう。ループは新しいイベントを待っています。ただし、後者の提案はマイクロ最適化であり、状況が多くのプロセス/コアのニーズに適合することを確認するには、慎重なベンチマークが必要です。マシン/シナリオに対して多くのワーカーを生成することで、実際にパフォーマンスを低下させることができます。
最終的に、spawnにNodeコマンドを送信することにより、上記の方法でspawnを使用できます。しかし、フォークはV8インスタンスの作成プロセスを最適化するためにいくつかのことを行うので、これはばかげたことでしょう。明確に言うと、最終的にスポーンにはフォークが含まれます。フォークはこの特定の、そして非常に便利なユースケースに最適です。
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
TLDR
Spawn
とき卵が作成されます- それは作成ストリーミングインタフェース親と子プロセスの間に。
ストリーミングインターフェイス手段 -バイナリ形式でのデータのバッファリングONE TIME
Fork
ときにフォークが作成されます-これは、作成した通信チャネルの親と子プロセスの間を
通信チャネル手段 -メッセージング
Difference
どちらも同じデータ転送を行っているように見えますが、以下の違いは除きます
spawnは、バイナリ/エンコード形式で連続データバッファーを実行する場合に便利です。例:1 GBのビデオファイル、画像、ログファイルを転送します。ONE TIME
フォークは、あなたがしたい場合に便利になりますメッセージング
例えば- JSON
またはXML
データ・メッセージング
Conslusion
spawnは、ビッグデータ/ファイル/画像をspawnプロセスから親プロセスにストリーミングするために使用する必要があります
Json / Xmlメッセージングを行うにはforkを使用する必要があります。
FORK
しますが、データの非常に大きな塊を持っている場合であることを他のBUFFEREDを、次に使用するSPAWN
child_process.spawnメソッドは、指定されたコマンドで新しいプロセスを起動します。それは次の署名を持っています-
child_process.spawn(command[, args][, options])
オプションについてもっと読む
spawn()メソッドはストリーム(stdout&stderr)を返し、プロセスが大量のデータを返すときに使用する必要があります。spawn()は、プロセスが実行を開始するとすぐに応答の受信を開始します。
child_process.forkメソッドは、ノードプロセスを作成するspawn()の特殊なケースです。それは次の署名を持っています-
child_process.fork(modulePath[, args][, options])
forkメソッドは、通常のChildProcessインスタンスにすべてのメソッドがあることに加えて、組み込みの通信チャネルを持つオブジェクトを返します。
var child = require('child_process').fork('child.js');
たとえばメインアプリで使用するとしますと、2つのコアが実行されるようになります。child.js(プロセス)で重い forループを実行する場合、本質的には、より多くのコアを使用してchild.jsに電力を供給します。ただし、そのCPU使用量は私のメインアプリコアに影響しますか?