cluster 工作原理
单个 Node.js 实例运行在单个线程中。 为了充分利用多核系统,有时需要启用一组 Node.js 进程去处理负载任务。
cluster 模块可以创建共享服务器端口的子进程。
工作进程由 child_process.fork() 方法创建,因此它们可以使用 IPC 和父进程通信,从而使各进程交替处理连接服务。
require 加载内置模块解析
判断内置模块
源码
function NativeModule(id) {
this.filename = `${id}.js`;
this.id = id;
this.exports = {};
this.module = undefined;
this.exportKeys = undefined;
this.loaded = false;
this.loading = false;
this.canBeRequiredByUsers = !id.startsWith('internal/');
}
// ...
const {
moduleIds,
compileFunction
} = internalBinding('native_module');
NativeModule.map = new Map();
for (let i = 0; i < moduleIds.length; ++i) {
const id = moduleIds[i];
const mod = new NativeModule(id);
NativeModule.map.set(id, mod);
}
moduleIds:内置模块的路径+文件ming。通过C++代码拿到this.canBeRequiredByUsers:是否是内置模块,moduleIds中,internal/文件夹下都是内置模块
cluster 执行流程

cluter对象,是EventEmitter对象的实例,具有eventemit、on等方法cluster.fork([env])env- 返回:
cluster.worker
cluster.setupMaster([settings])settings- 用于修改默认的
fork行为。 一旦调用,将会按照settings对cluster.settings进行设置。 - 所有的设置只对后来的
.fork()调用有效,对之前的工作进程无影响。
process.execArgv属性返回当·Node.js 进程被启动时,Node.js 特定的命令行选项。 这些选项在
process.argv属性返回的数组中不会出现,并且这些选项中不会包括Node.js的可执行脚本名称或者任何在脚本名称后面出现的选项。 这些选项在创建子进程时是有用的,因为他们包含了与父进程一样的执行环境信息。$ node --harmony script.js --versionprocess.execArgv的结果:['--harmony']process.argv的结果:['/usr/local/bin/node', 'script.js', '--version']setup事件每当
cluster.setupMaster()被调用时触发。work.process是child_process.fork()创建的进程在主进程中,访问
cluster.workers获得工作进程信息。其是一个哈希表,储存了活跃的工作进程对象,使用id作为键名。只能在主进程中访问internal/cluster/child.js规定了工作进程的行为,这里定义了cluster.worker,保存工作进程对象的引用。 在工程进程中可访问,指向当前工作进程。
疑问
workerProcess由child_process.fork()创建'internalMessage'事件怎么触发,返回的参数message和handle是什么?- 其
send方法干了啥?
见
child_process异步源码解析文章fork部分,setupChannel(child, ipc)