浅谈浅谈Node 异步异步IO和事件循环和事件循环
前言前言
学习Node就绕不开异步IO, 异步IO又与事件循环息息相关, 而关于这一块一直没有仔细去了解整理过, 刚好最近在做项目
的时候, 有了一些思考就记录了下来, 希望能尽量将这一块的知识整理清楚, 如有错误, 请指点轻喷~~
一些概念一些概念
同步异步同步异步 & 阻塞非阻塞阻塞非阻塞
查阅资料的时候, 发现很多人都对 异步和非阻塞 的概念有点混淆, 其实两者是完全不同的, 同步异步指的是 行为即两者之间的关
系 , 而阻塞非阻塞指的是 状态即某一方 。
以前端请求为一个例子,下面的代码很多人都应该写过
$.ajax(url).succedd(() => {
......
// to do something
})
同步异步
如果是同步的话, 那么应该是client发起请求后, 一直等到serve处理请求完成后才返回继续执行后续的逻辑, 这样 client和
serve之间就保持了同步的状态 。
如果是异步的话, 那么应该是client发起请求后, 立即返回 , 而请求可能还没有到达server端或者请求正在处理, 当然在异步
情况下, client端通常会注册事件来处理请求完成后的情况, 如上面的succeed函数。
阻塞非阻塞
首先需要明白一个概念, Js是单线程, 但是浏览器并不是, 事实上你的请求是浏览器的另一个线程在跑。
如果是阻塞的话, 那么 该线程就会一直等到这个请求完成之后才能被释放用于其他请求 。
如果是非阻塞的话, 那么 该线程就可以发起请求后而不用等请求完成继续做其他事情 。
总结
之所以经常会混乱是因为没有说清楚讨论的是哪一部分(下面会提到), 所以 同步异步讨论的对象是双方, 而阻塞非阻塞讨论的对象
是自身 。
IO和和CPU
Io和Cpu是可以同时进行工作的 。
IO:
I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。
cpu
解释计算机指令以及处理计算机软件中的数据。
Node中的异步中的异步IO模型模型
IO分为 磁盘IO和网络IO , 其具有两个步骤
等待数据准备 (Waiting for the data to be ready)
将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
Node中的磁盘中的磁盘Io
以下的讨论基于*nix系统。
理想的异步Io应该像上面讨论的一样, 如图: