node.js
var cluster = require('cluster')
var numCPUS = require('os').cpus().length
if(cluster.isMaster){//主进程代码
console.log(numCPUS)
for(var i=0;i<numCPUS;i++){
var worker = cluster.fork()
}
}else{
require('./app.js')
}
//pm2
nodejs开启多进程 ps aux | grep node 查看当前运行几个nodejs进程
守护进程setsid
node.js
nodebindings add-ons
nodebindings 接入:v8 libuv的eventloop libuv的io异步事件 dns
nodebindings通过系统调用 (os operation )libuv ,会存在循环队列中,libuv会把循环队列中的回调通过事件循环放在工作线程中执行,事件循环把回调结果通过系统调用os operation返回v8,同时吧循环队列中的事件清除掉,最后再到代码
add-ons 接入:ssl http zlib解压缩
libuv的eventloop 7个阶段
1.update timer 更新系统时间 为之后timer提供计时的下标,避免过多调用影响系统性能
2.run timer 运行timer settimeout setinterval
3.pending io/callback队列 文件读取,网络io
4.idle/prepare 在内部做一些事情,如果节点状态为active状态,每次事件循环都会调用 process.nexttick
5.io/poll阶段 调用各平台提供的io多路复用接口,执行io回调,调用循环队列中的事件,如果poll队列不为空,将会递归遍历事件循环同步执行callback队列,直到队列为空,如果poll队列为空,有setimmedate会立即进入,等待callback添加到队列中,然后立即执行,有超时timmer会回到timmer
6.check阶段 setimmediate
7.close callbacks 关闭io 连接断开,文件描述符的关闭
Node.js 中的事件循环与浏览器中的事件循环在某些方面有一些重要的差异:
-
EventEmitter vs. Web APIs:
- Node.js: Node.js 中使用
EventEmitter来实现事件触发与监听,其核心是通过事件驱动的方式进行异步编程。 - 浏览器: 浏览器中的事件循环依赖于 Web APIs,包括 DOM 事件、定时器、Ajax 等。
- Node.js: Node.js 中使用
-
宏任务和微任务的差异:
- Node.js: Node.js 中宏任务主要包括事件循环的不同阶段,例如 timers、I/O callbacks、idle、poll 等。微任务主要包括
process.nextTick和Promise的回调。 - 浏览器: 浏览器中宏任务包括整体的 script 执行、I/O 操作、渲染等,微任务包括
Promise的回调、MutationObserver的回调等。
- Node.js: Node.js 中宏任务主要包括事件循环的不同阶段,例如 timers、I/O callbacks、idle、poll 等。微任务主要包括
-
setImmediate 和 process.nextTick:
- Node.js:
process.nextTick在事件循环的当前阶段执行,优先级高于微任务。setImmediate则在事件循环的下一次迭代执行。 - 浏览器: 浏览器没有
setImmediate,而是使用setTimeout(fn, 0)来实现类似的效果。
- Node.js:
-
I/O 操作的处理:
- Node.js: Node.js 通过 libuv 提供了异步非阻塞的 I/O 操作,这使得 Node.js 能够高效地处理大量并发请求。
- 浏览器: 浏览器中的异步操作主要涉及到 Web APIs,如 XMLHttpRequest、Fetch API,以及其他与 DOM 交互的操作。

浙公网安备 33010602011771号