177

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

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

4

3 に答える 3

249

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

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

経験則としては、コアあたり 1 ~ 2 個のノード プロセスを使用することをお勧めします。これは、ラム クロックと CPU クロックの比率が良好なマシンの場合、または I/O が多く CPU 作業が少ないノード プロセスの場合は、おそらくそれ以上です。ループは新しいイベントを待っています。ただし、後者の提案はマイクロ最適化であり、状況が多くのプロセス/コアのニーズに合っていることを確認するには、慎重なベンチマークが必要です。マシン/シナリオに対してあまりにも多くのワーカーを生成すると、実際にはパフォーマンスが低下する可能性があります。

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

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

于 2013-07-25T15:10:08.107 に答える
7
  • spawn - child_process.spawnは、指定されたコマンドで新しいプロセスを起動します。
  • fork - child_process.forkメソッドは、子プロセスを作成するためのspawn()の特殊なケースです。

spawn() メソッド

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

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

オプションの詳細を読む

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

fork() メソッド

child_process.forkメソッドは、 Node プロセスを作成するためのspawn()の特殊なケースです。次の署名があります-</p>

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

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

于 2018-09-06T09:21:51.913 に答える