node js使用fork函数vs spawn进行线程化

时间:2016-08-05 10:47:06

标签: node.js

我知道节点js fork函数会创建一个新的V8实例,而spawn函数却没有。说fork允许你在节点js中使用多线程(在多核机器上)是否正确,因此fork是你想要执行重载时的最佳选择脚本不会影响父脚本的性能吗?

感谢。

1 个答案:

答案 0 :(得分:3)

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

Fork是spawn的一个特殊实例,它运行V8引擎的新实例。这意味着,您实际上可以创建多个工作程序,在完全相同的节点代码库上运行,或者可能为特定任务创建不同的模块。这对于创建工作池最有用。虽然节点异步事件模型允许相当高效地使用机器的单个核心,但它不允许节点进程使用多核机器。实现此目的的最简单方法是在单个处理器上运行同一程序的多个副本。

一个好的经验法则是每个核心有一到两个节点进程,对于具有良好ram时钟/ cpu时钟比率的机器来说可能更多,或者对于I / O上的节点进程和CPU工作时的轻量级进程,以最小化事件循环等待新事件的时间。但是,后一种建议是微观优化,需要仔细的基准测试,以确保您的情况适合许多流程/核心的需求。实际上,您可以通过为您的计算机/方案生成太多的工作程序来降低性能。

最终,你可以通过发送一个Node命令来以上述方式使用spawn。但这很愚蠢,因为fork会做一些事情来优化创建V8实例的过程。只是说清楚,最终产生包括fork。 Fork对于这个特殊且非常有用的用例来说是最佳选择。

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

取自 - https://stackoverflow.com/a/17861879/2148827