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
node bindings 核心c++库 add-ons 扩展
node bindings 接入:v8 libuv的eventloop libuv的io异步事件 dns
node bindings通过系统调用 (os operation )libuv ,会存在循环队列中,libuv会把循环队列中的回调包装成task 通过事件循环放在工作线程中执行,事件循环把回调结果通过系统调用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 在内部做一些事情,做一些勾子、占位
5.io/poll阶段 有超时timer会回到timer ,有setimmedate会立即进入,立即结束 poll,跳到 check 阶段,阻塞等待 I/O 事件(阻塞时间不超过最近的 timer 剩余时间),有 I/O 事件到来 → 执行对应的回调,执行完当前轮 I/O 回调后,如果还有更多回调,继续执行(但不会无限循环)
6.check阶段 setimmediate
7.close callbacks 关闭io 连接断开,文件描述符的关闭
process.nexttick独立于其他阶段 他是在每个阶段结束后立即执行
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,而是使用setTimeout(fn, 0)来实现类似的效果。
- Node.js:
-
I/O 操作的处理:
- Node.js: Node.js 通过 libuv 提供了异步非阻塞的 I/O 操作,这使得 Node.js 能够高效地处理大量并发请求。
- 浏览器: 浏览器中的异步操作主要涉及到 Web APIs,如 XMLHttpRequest、Fetch API,以及其他与 DOM 交互的操作。

浙公网安备 33010602011771号