[关闭]
@elibinary 2017-09-23T14:21:36.000000Z 字数 713 阅读 959

Node 异步 I/O 与事件驱动架构概览

nodejs


'Evented I/O for V8 JavaScript' 这句 Node.js 的简短介绍,非常全面的表述了 Node.js 的特点。

废话不多说,直接看图

node event io - 1

整体运行简化图大致如此,我们知道 node 是单进程单线程的,node 在启动的时候就会开启一个循环,每一次循环就是一个 Tick 周期,每个 Tick 周期就是 node 的最小执行单元了。

Event Loop 在每一个 Tick 开始的时候会去 Event Queue 中查看是否有事件等待处理,如果有就取出来执行,在执行过程中如果有 I/O block 就扔给一个线程去处理,该线程处理完 IO 后再通过 callback 函数把后续处理添加到 Event Queue 中。

通过这整个过程来避免 I/O 阻塞主进程,造成 CPU 浪费的情况。
当然如果事件中没有 I/O 阻塞,那么在一整个 Tick 中执行完毕后就直接正常返回,如下图

node event io - 2

举个例子

  1. fs.open = function(path, flags, mode, callback) {
  2. binding.open(pathModule._makeLong(path),
  3. stringToFlags(flags),
  4. mode,
  5. callback); 10
  6. };

当主进程执行到该文件操作的时候,不会阻塞在这里等待 IO 准备完成,而是把这个文件操作扔给一个线程去执行,然后接着往下执行下面的代码,当文件 IO 准备好后 IO 线程通过 callback 函数把后续事件添加到事件队列中等待主进程取出执行。

在整个异步 IO 调用的过程中,其实 callback 函数并不由开发者来调用。

贴一个在看到的一个更加完整的图

图片来自 Node.js的事件驱动模型

事件循环、观察者、请求对象以及 I/O 线程池构成了 Node 异步 I/O 模型的基本要素。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注