177

这似乎是一个基本问题,但我找不到任何文档:

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

4

3 回答 3

249

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

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

一个好的经验法则是每个核心有一到两个节点进程,对于具有良好 ram 时钟/cpu 时钟比的机器,或者对于 I/O 重而 CPU 工作轻的节点进程,可能更多,以最大限度地减少事件的停机时间循环正在等待新事件。但是,后一种建议是微优化,需要仔细进行基准测试以确保您的情况适合许多进程/核心的需求。实际上,您可以通过为您的机器/场景生成过多的工作人员来降低性能。

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

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

于 2013-07-25T15:10:08.107 回答
32

产卵

当 spawn 被调用时,它会在父进程和子进程之间 创建一个流接口。流接口— 以二进制格式一次性缓冲数据。

叉子

调用fork时,会在父子进程之间 创建一个通信通道——消息传递

Spawn 和 Fork 的区别

虽然两者在传输数据的方式上听起来非常相似,但还是存在一些差异。

  • 当您想要以二进制/编码格式进行连续数据传输时,Spawn 很有用——例如传输 1 GB 的视频、图像或日志文件。
  • Fork 在您想要发送单个消息时很有用——例如JSONXML数据消息。

结论

Spawn 应该用于将大量数据(如图像)从衍生进程流式传输到父进程。

Fork 应该用于发送JSONXML消息。例如,假设从父进程创建了十个分叉进程。每个进程执行一些操作。对于每个进程,完成操作将向父进程发送一条消息,说明类似"Process #4 done"or "Process #8 done"

于 2019-06-09T11:07:26.427 回答
7
  • spawn - child_process.spawn使用给定命令启动一个新进程。
  • fork - child_process.fork方法是spawn()创建子进程的特例。

spawn() 方法

child_process.spawn 方法使用给定的命令启动一个新进程。它具有以下签名 -</p>

child_process.spawn(command[, args][, options])

阅读有关选项的更多信息

spawn() 方法返回流(stdout &stderr),当进程返回大量数据时应该使用它。spawn() 在进程开始执行后立即开始接收响应。

fork() 方法

child_process.fork方法是spawn()创建 Node 进程的一个特例。它具有以下签名 -</p>

 child_process.fork(modulePath[, args][, options])

除了在普通 ChildProcess 实例中包含所有方法之外,fork 方法还返回一个具有内置通信通道的对象。

于 2018-09-06T09:21:51.913 回答