Node.js之基础概念

栏目 Node.js

简介 #

js单线程,不用在意状态的同步问题,没有死锁

Node.js 不擅长cpu密集服务?

单线程,如果有长时间运行的计算,会让cpu时间片不能释放,不能处理后续,可以适当调整和分解,就能让运算适时释放。 js的一个弱点是位运算,java有int,但js只有double

回答的核心,单线程计算不行,需要及时调整和分解。

如果是纯计算场景,应该采取多线程方式进行计算,可以私用node的c c++拓展,可以比java还快。也可以使用子进程,把一部分node进程常主任吴,进程传递信息。

异步I/O #

node.js 是一个 异步 的 事件驱动的 js 运行时。

异步,非阻塞。实际效果都达到了并行I/O的目的。

异步/同步阻塞/非阻塞,是两回事。

操作系统内核对 I/O 只有阻塞和非阻塞。

读取文件天然的会阻塞。阻塞会让CPU等待I/O,浪费性能和实践。

为了解决这个问题,内核提供了非阻塞I/O ,调用之后会立即返回。后面轮询重复调用判断来获取完整数据。

轮询本质还是同步,浪费时间,node提供 libuv 作为抽象层,跨平台地实现了异步I/O

node的异步I/O #

异步api:

  • 定时器 setTimeout setInterval
  • process_nextTick() setImmediate

定时器有问题。时间是非精确的,如果上一次循环占用时间多,会推迟下一次任务。

使用process.nextTick() 会把回调函数放入队列。时间复杂度比较低。

setImmediate() 和nextTick 类似,都是延迟回调函数。区别是, setImmediate 慢于 nextTick

process.nextTick属于 idle观察者, setImmediate 属于check观察者 先后关系:idle观察者 > I/O观察者 > check 观察者

如何运行和调试 #

推荐 nodemon 和 vscode debugger

模块 #

commonJS 的模块

var math = require('math')
// 另一个文件引入
exports.add=function(){}

内置模块 #

  • os
  • fs
  • buffer
  • http

fs 模块可以拓展到 util.promisify ,如果别人问你,node12 就开放了 await fs.promise.readFile

buffer

http 模块,可以创建一个服务器

stream 流


本文参考资料:

  • 狼书:更了不起的node.js
  • 深入浅出node.js 朴灵 编著
  • 开课吧资料

开课吧夏老师的id su37josephxia