node.js子プロセス-スポーンとフォークの違い


141

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

node.jsプロセスのフォークとスポーンの違いは何ですか?フォークはスポーンの特殊なケースであると読みましたが、それぞれを使用する場合のさまざまなユースケース/影響は何ですか?

回答:


215

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


@ChrisCM、var child = require('child_process').fork('child.js');たとえばメインアプリで使用するとしますと、2つのコアが実行されるようになります。child.js(プロセス)で重い forループを実行する場合、本質的には、より多くのコアを使用してchild.jsに電力を供給します。ただし、そのCPU使用量は私のメインアプリコアに影響しますか?
NiCkニューマン

2
他のものに影響を与えずにCPUで何かを行うことは不可能です。スケジューリング、共有キャッシュの使用、BUSトラフィックなど。ただし、別のコアを利用し、メインの実行ループはほとんど影響を受けないようにする必要があります。同様に、同じシングルコアプロセッサで2つのプロセスを実行することで予想される深刻な悪影響はありません。この時点で、適切に最適化するかどうかは、オペレーティングシステムとハードウェアの設定次第です。セットアップが異なると、異なる結果が得られる場合があります。
ChrisCM、2015

@ChrisCMええ、私はグローバルMonsterLoopを使用してモンスターの位置を同期します。そのオブジェクトが反復するオブジェクトは、最大で5,000キーです。私は2秒ごとに繰り返し、フォークすると、CPU(メインゲーム1)から何百ものメモリ使用量を削減しているように見えます。ループアウトをクラスター化して、コアごとにxx回実行する代わりに、この方法で実行したいのですが... Ty for your insight〜今は、Redisと内部IPCのどちらを使用する必要があるのか​​わかりません。 P
NiCkニューマン

2
「なぜ」にご回答いただきありがとうございます。これまでに読んだすべての投稿で、説明の簡単な部分を逃してしまいました。
aaaaaa

@ChrisCMで「..しかし、ノードプロセス内でそれ以上のコードは実行されません..」と答えます。メインスレッドが待機していて何も処理していないということですか?YESの場合、ここでspawnを使用することは何ですか?
Abhi

9

TLDR

Spawn

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

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

Fork

ときにフォークが作成されます-これは、作成した通信チャネルの親と子プロセスの間を

通信チャネル手段 -メッセージング

Difference

どちらも同じデータ転送を行っているように見えますが、以下の違いは除きます

spawn、バイナリ/エンコード形式で連続データバッファーを実行する場合に便利です。例:1 GBのビデオファイル、画像、ログファイルを転送します。ONE TIME

フォークは、あなたがしたい場合に便利になりますメッセージング 例えば- JSONまたはXMLデータ・メッセージング

Conslusion

spawnは、ビッグデータ/ファイル/画像をspawnプロセスからプロセスにストリーミングするために使用する必要があります

Json / Xmlメッセージングを行うにはforkを使用する必要があります。

  • たとえば、親から10のフォークプロセスが作成されたとします。
  • そして各プロセスはいくつかの操作を実行します
  • そして完成操作上の各プロセスは「親へのメッセージ送信しますプロセスの4番が行われ、」「行われたプロセス8番を

親から子へ、そして最後にファイル内への継続的なロギングデータについてはどうですか?
エスカルース

1
@Esqarrouth、それが継続的なストリームまたはメッセージになるかどうかを識別する必要があります。そして、あなたは単語「連続loging」私はイエスが、その後使用する場合は、uは子供へのログ(JSON)にwrtingされると信じて使用FORKしますが、データの非常に大きな塊を持っている場合であることを他のBUFFEREDを、次に使用するSPAWN
ビジェイを

5
  • 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()の特殊なケースです。それは次の署名を持っています-

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.