这可能看起来像一个基础问题,但我找不到任何文档:
forking 和 spawning 一个 node.js 进程有什么区别?我已经读到 forking 是 spawning 的一种特殊情况,但它们各自使用的不同用例 / 影响是什么?
这可能看起来像一个基础问题,但我找不到任何文档:
forking 和 spawning 一个 node.js 进程有什么区别?我已经读到 forking 是 spawning 的一种特殊情况,但它们各自使用的不同用例 / 影响是什么?
Spawn是一个命令,旨在运行系统命令。当你运行spawn时,你发送的是一个将在自己的进程中运行的系统命令,但不会在节点过程中执行任何其他代码。你可以为所生成的进程添加监听器,以允许你的代码与生成的进程进行交互,但没有创建新的V8实例(除非你的命令是另一个Node命令,在这种情况下,你应该使用fork!),并且处理器上只有一个副本你的节点模块。
Fork是spawn的特殊实例,它运行全新的V8引擎实例。这意味着,你可以创建多个工作线程,运行在完全相同的Node代码库上,或者为特定任务创建不同的模块。这对于创建工作线程池非常有用。虽然节点的异步事件模型允许单个机器核心相当高效地使用,但它无法利用多核机器的节点进程。最简单的方法是在单个处理器上运行多个相同程序的副本。
一个好的经验规则是每个核心一到两个节点进程,也许对于具有良好ram时钟/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
当调用 Spawn 时,它会在父进程和子进程之间创建一个 流接口(streaming interface)。
流接口 — 一次性以二进制格式缓冲数据。当调用 Fork 时,它会在父进程和子进程之间创建一个 通信通道(communication channel)。
通信通道 — 消息传递。虽然两者在数据传输方面听起来很相似,但它们存在一些区别。
应该使用 Spawn 将大量数据流式传输,例如从生成的进程向父进程传输图像。
应该使用 Fork 发送 JSON 或 XML 消息。例如,假设从父进程创建了十个分叉进程。每个进程执行一些操作。对于每个进程,完成操作将向父进程发送一个消息,例如“第4个进程完成了”或“第8个进程完成了”。
FORK
;否则,如果你有非常大的数据块要缓冲,则请使用SPAWN
。 - vijaychild_process.spawn 方法使用给定命令启动新进程。它具有以下签名 -
child_process.spawn(command[, args][, options])
阅读有关选项的更多信息。
spawn() 方法返回流(stdout 和 stderr),应在进程返回大量数据时使用。当进程开始执行时,spawn() 开始接收响应。
child_process.fork 方法是使用 spawn() 创建 Node 进程的特殊情况。它具有以下签名 −
child_process.fork(modulePath[, args][, options])
Spawn -
Fork-
创建父子进程之间的通信渠道。适用于以json/xml格式发送单个消息。
创建一个新的v8实例。
var child = require('child_process').fork('child.js');
,那么现在我将有两个独立的核心正在运行。如果我在child.js(进程)中运行一个重型循环,那么实际上我将利用更多的核心来支持child.js,对吗?但是,这种CPU使用会影响我的主应用程序核心吗? - NiCk Newman