1. ホーム
  2. node.js

[解決済み] node.jsの子プロセス - spawnとforkの違い

2022-04-21 21:57:04

質問

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

node.jsのプロセスをforkするのとspawnするのでは何が違うのでしょうか?私はフォークがスポーニングの特殊なケースであると読んだことがありますが、それぞれを使用するための異なるユースケース/レペゼンションは何でしょうか?

どのように解決するのですか?

Spawnは、システムコマンドを実行するために設計されたコマンドです。 spawnを実行すると、それ自身のプロセスで実行されるシステムコマンドが送信されますが、あなたのノードプロセス内でそれ以降のコードが実行されることはありません。 しかし、新しいV8インスタンスは生成されず(もちろんコマンドが他のNodeコマンドでない限りですが、この場合はforkを使うべきです!)、プロセッサ上でアクティブになるのはノードモジュールの1つのコピーだけです。

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

RAMクロックとCPUクロックの比率が高いマシンでは、1コアあたり1~2ノードプロセス、またはI/Oが多くCPUワークが少ないノードプロセスでは、イベントループが新しいイベントを待つダウンタイムを最小限に抑えるために、それ以上のノードプロセスが推奨されます。 しかし、後者の提案はマイクロ最適化であり、多くのプロセス/コアの必要性に適した状況を確認するために慎重なベンチマークが必要でしょう。 あなたのマシンやシナリオに対してあまりに多くのワーカーを生成すると、実際にパフォーマンスが低下する可能性があります。

最終的には、Nodeコマンドをspawnに送ることで、上記のような方法でspawnを使用することができます。 なぜなら、forkはV8インスタンスを生成するプロセスを最適化するためにいくつかのことを行うからです。 最終的にspawnはforkを包含しているということを明確にしておくだけです。 forkはこの特定の、そして非常に便利なユースケースに最適なだけです。

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