node是单线程非阻塞异步I/O的模式。
- 阻塞I/O:完成整个数据获取的过程;
- 非阻塞I/O:不带数据,直接立即返回,要获取数据,还需通过文件描述符再次读取。
node完成整个异步I/O的有事件循环、观察者、请求对象、执行回调;
-
事件循环:这是node自身的执行模式。在进程启动时,node会创建一个循环,每执行一次循环就会查看是否有事件处理,有,就取出事件及相关的回调函数。如果存在关联的回调函数,就执行他们,然后进入下一个循环,如果不在有事件处理就退出循环。
-
观察者:浏览器在解析页面时,有些事件可能是来自用户的点击或者加载某些文件是产生,而这些产生的事件都是相应的观察者,当我们在执行一个node进程的时候,每一个事件循环都有一个或多个观察者,而判断是否有事件要处理的过程就是向这些观察者询问是否有要处理的事件。
-
请求对象:我们在进行异步调用的时候就会封装一个请求对象,用于放入I/O线程池等待执行,已完成整个异步I/O的I/O操作。
-
执行回调:组装好请求对象,然后总入I/O线程池等待执行,实际上是完成了异步I/O的第一部分,回调执行时第二部分。在每次事件循环执行中,他调用的请求对象都会加入到I/O观察者的队列,然后将其当做事件处理。
-
整个异步I/O的流程图:
-
总结
异步调用——(请求对象)——>I/O线程池——(观察者)——>事件循环。