node.js子进程 - spawn和fork之间的区别

Hit*_*esh 127 process parent-child node.js

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

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

Chr*_*sCM 193

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

  • 在不影响其他事情的情况下,不可能在CPU上执行任何操作.调度,共享缓存使用,总线流量等.但是,它应该利用单独的核心,并使主运行循环MOSTLY不受影响.同样,并不是你期望在同一个核心处理器上运行两个进程的严重负面影响.此时,真正由操作系统和硬件设置来正确优化.不同的设置可能会产生不同的结果. (2认同)
  • 感谢您解答"为什么" - 我读到的所有帖子直到这一点都错过了解释的简单部分. (2认同)

vij*_*jay 21

产卵

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

叉子

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

Spawn 和 Fork 之间的差异

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

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

结论

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

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

  • @Esqarrouth,您需要确定它是连续流还是消息。你使用了“连续日志”这个词,我相信你会写日志(JSON)给孩子,如果是,那么使用`FORK`,否则如果你有很大的数据块要**缓冲**,那么使用`SPAWN` (2认同)

Igo*_*ich 7

  • 产卵child_process.spawn使用给定命令启动一个新进程。
  • 叉子?该child_process.fork方法是一个特殊的情况下产卵()创建子进程。

spawn() 方法

child_process.spawn 方法使用给定的命令启动一个新进程。它有以下签名?

child_process.spawn(command[, args][, options])
Run Code Online (Sandbox Code Playgroud)

阅读有关选项的更多信息

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

fork() 方法

child_process.fork方法是spawn()创建 Node 进程的特例。它有以下签名?

 child_process.fork(modulePath[, args][, options])
Run Code Online (Sandbox Code Playgroud)

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