小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Node.js 简介
Node.js
是一个基于 Chrome V8
引擎的 JavaScript
运行环境。Node.js
使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js
的包管理器 npm
, 是全球最大的开源库生态系统
Node.js
是一个开源和跨平台的JavaScript
运行时环境。
Node.js 的特点
- 异步的 I/O
- 事件机制
- 单线程
- 跨平台
Node.js 的运行机制
V8
引擎解析javaScript
脚本,解析后的代码,调用Node
的API
libuv
库负责API
的执行。它将不同的任务分配给不同的线程,形成一个Event Loop
(事件循环),以异步的方式将任务的执行结果返回给V8
引擎V8
引擎再将结果返回给用户
Node.js 事件循环机制
node 的 Event Loop
发生在 libuv
层,libuv
是一个基于事件驱动的跨平台抽象层,封装了不同操作系统一些底层特性,对外提供统一的 API
。
1. timers
执行 setTimeout()
和 setInterval()
中的 callback
2. pending callback
执行上一次推迟到这一次循环迭代的 I/O
回调
3. idle, prepare
只在内部使用
4. poll
检索新的I/O
事件; 执行与I/O
相关的回调(几乎所有的回调,由setTimeout()
和 setInterval()
和setImmediate()
除外),Node
将在适当的时候阻塞这里。
主要做了两件事:
- 计算应该阻塞多长时间并轮询I/O (1. Calculating how long it should block and poll for I/O, then)
- 处理 轮询 队列里的事件。(Processing events in the poll queue)
5. check
执行 setImmediate()
的 callback
6. close callback
执行close
事件的callback
。e.g:socket.on('close', ...)
.
setImmediate() 对比 setTimeout()
setImmediate()
一旦在当前 轮询 阶段完成, 就执行脚本。setTimeout()
在最小阈值(ms
单位)过后运行脚本。
如果你把这两个函数放入一个 I/O 循环内调用,
setImmediate
总是被优先调用
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
})
immediate
timeout
process.nextTick()
任何时候在给定的阶段中调用 process.nextTick()
,所有传递到 process.nextTick()
的回调将在事件循环继续之前解析。
作用:
- 允许用户处理错误,清理任何不需要的资源,或者在事件循环继续之前重试请求。
- 有时有让回调在栈展开后,但在事件循环继续之前运行的必要。
结语
如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。
文章如有错误之处,希望在评论区指正🙏🙏。
附: