2016-08-05 58 views
1

我知道节点js fork函数创建一个新的V8实例,而不是spawn函数。如果说fork允许您在节点js中(在多核机器上)使用多线程,那么它是正确的,因此当您要执行重负载脚本而不影响父代的性能时,fork是最佳选择脚本?节点js使用fork函数vs spawn线程

谢谢。

回答

2

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

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

一个好的经验规则是每个核心一到两个节点处理,也许是更为具有良好的冲压时钟/ CPU时钟比机,或用于节点进程上CPU工作的I/O和光重,以最小化停机时间事件循环等待新事件。然而,后一个建议是微观优化,需要仔细的基准测试以确保您的情况适合多个流程/核心的需求。您实际上可以通过为您的机器/场景产生过多的工人来降低性能。

最终,您可以通过发送spawn节点命令,以上述方式使用spawn。但是这很愚蠢,因为fork会做一些事情来优化创建V8实例的过程。只要说清楚,最终产卵就包含叉子。叉子对于这个特别的,非常有用的用例来说是最佳的。 https://stackoverflow.com/a/17861879/2148827

-

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

来自