这似乎是一个基本问题,但我找不到任何文档:
分叉和产生一个 node.js 进程有什么区别?我读到过分叉是产生的一种特殊情况,但是使用它们的不同用例/后果是什么呢?
Spawn 是一个用于运行系统命令的命令。当您运行 spawn 时,您将向它发送一个系统命令,该命令将在它自己的进程上运行,但不会在节点进程中执行任何进一步的代码。您可以为您生成的进程添加侦听器,以允许您的代码与生成的进程进行交互,但是不会创建新的 V8实例(当然,除非您的命令是另一个 Node 命令,但是在这种情况下您应该使用 fork!)处理器上只有一个节点模块的副本处于活动状态。
Fork 是 spawn 的一个特殊实例,它运行 V8引擎的一个新实例。这意味着,您实际上可以创建多个 worker,它们运行在完全相同的 Node 代码基上,或者为特定任务创建不同的模块。这对于创建工作池非常有用。虽然 node 的异步事件模型允许相当有效地使用一台机器的单个核心,但它不允许一个节点进程使用多核心机器。实现这一点的最简单方法是在单个处理器上运行同一程序的多个副本。
一个好的经验法则是每个核心有一到两个节点进程,对于内存时钟/CPU 时钟比较好的机器,或者对于 I/O 比较重、 CPU 工作量较少的节点进程,可能需要更多时间,以尽量减少事件循环等待新事件的停机时间。然而,后一个建议是一个微观优化,需要仔细的基准测试,以确保您的情况适合许多流程/核心的需要。您实际上可以通过为您的机器/场景生成太多的工作人员来降低性能。
最终,您可以通过发送一个 Node 命令,以上述方式使用 spawn。但是这将是愚蠢的,因为 fork 做了一些事情来优化创建 V8实例的过程。我只想说清楚,最终产卵包括叉子。Fork 对于这个特殊的、非常有用的用例来说是最佳的。
Http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
Child _ process. spawn 方法使用给定的命令启动一个新进程
child_process.spawn(command[, args][, options])
了解更多关于 选择的信息
Spawn ()方法返回流(stdout & stderr) ,当进程返回大量数据时应该使用它。Spawn ()在进程开始执行时立即开始接收响应。
Child _ process. fork 方法是 产卵()创建 Node 进程的特例
child_process.fork(modulePath[, args][, options])
Fork 方法返回一个具有内置通信通道的对象,此外还具有常规 ChildProcess 实例中的所有方法。
当调用 spawn 时,它会在父进程和子进程之间创建一个 流媒体接口。 流式接口 ーー以二进制格式对数据进行一次性缓冲。
当调用 fork 时,它会在父进程和子进程之间创建一个 通讯频道 通讯频道
虽然两者传输数据的方式听起来非常相似,但也有一些不同之处。
JSON
XML
Spawn 应该用于将大量数据(如图像)从衍生进程流向父进程。
应使用分叉发送 JSON或 XML消息。例如,假设从父进程创建了十个分叉进程。每个进程执行一些操作。对于每个进程,完成该操作将向父进程发送一条消息,说明类似于 "Process #4 done"或 "Process #8 done"的内容。
"Process #4 done"
"Process #8 done"
产卵
叉子
创建通信通道 b/w 父进程和子进程 在 json/xml 中发送单独的消息。
创建一个新的 v8实例。