node.jssubprocess – spawn和fork之间的区别

这可能看起来像一个基本的问题,但我找不到任何文档:

分叉和产生一个node.js过程有什么区别? 我已经读过分叉是产卵的一个特殊情况,但是使用它们的每个使用情况/重新使用有什么不同?

Spawn是一个用来运行系统命令的命令。 当你运行spawn的时候,你发送一个系统命令,它将在自己的进程上运行,但是不会在你的节点进程中执行任何进一步的代码。 你可以为你所产生的进程添加监听器,以允许你的代码与产生的进程进行交互,但是不会创build新的V8实例(除非你的命令是另一个Node命令,但在这种情况下,你应该使用fork!)和处理器上只有一个节点模块副本处于活动状态。

Fork是一个特殊的spawn实例,它运行了V8引擎的新实例。 意思是,你可以基本上创build多个工作,在完全相同的节点代码库上运行,或者为特定任务创build一个不同的模块。 这对创build工作池非常有用。 虽然节点asynchronous事件模型允许一台机器的单个核心被有效地使用,但是它不允许一个节点进程使用多核心机器。 最简单的方法是在一个处理器上运行同一程序的多个副本。

一个好的经验法则是每个核心有一到两个节点进程,对于具有良好内存时钟/ CPU时钟比率的机器,或者对于I / O和CPU工作重要的节点进程,可能更多,以最小化事件的停机时间循环正在等待新的事件。 然而,后面的build议是一个微观优化,需要小心的基准来确保你的情况适合于许多进程/核心的需求。 实际上,通过为您的计算机/场景产生过多的工人,可能会降低性能。

最终,你可以使用上述的方式产生spawn的节点命令。 但是这将是愚蠢的,因为fork会做一些事情来优化创buildV8实例的过程。 只要说清楚,最终产卵包括叉子。 叉是这个特殊的,非常有用的用例的最佳select。

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