Node.js的线程处理:fork和spawn函数的区别

3
我知道node js的fork函数会创建一个新的V8实例,而spawn函数则不会。是否可以这样说:fork允许您在多核机器上使用多线程,在执行高负载脚本时不会影响父脚本的性能,因此fork是最好的选择?谢谢。
1个回答

4

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

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

一个经验法则是每个核心运行一到两个节点进程,对于内存时钟/CPU时钟比例良好的机器或者I/O较重CPU较轻的节点进程,可以增加进程数量,以最小化事件循环等待新事件的停机时间。然而,后一种建议是微观优化,需要仔细地基准测试以确保您的情况适合多个进程/核心的需求。在您的机器/场景中生成太多的工作程序实际上可能会降低性能。
最终,您可以使用spawn以以上述方式发送Node命令。但这很愚蠢,因为fork做了一些优化创建V8实例的过程。只是要明确,最终spawn包含fork。Fork只是针对这个特定且非常有用的用例进行优化。

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

摘自 - https://dev59.com/E2Mm5IYBdhLWcg3wHMJ0#17861879


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接