关于对Node.js的“单线程非阻塞异步I/O”特点的个人理解
2017-06-17 17:28
507 查看
关于Node.js的运行机制的个人理解:
(1)当发起一个异步(非阻塞或阻塞)调用时,就会封装异步调用的请求对象。
(2)封装完后的对象就会放入线程池内等待执行。
(3)当线程池查询有空时就会执行请求对象里面的I/O操作,执行完之后就会把结果封装到请求对象中并通知事件循环中的I/O观察者。
(4)I/O观察者就会取出请求对象的结果(也就是回调函数)进行执行。
每个特点的体现:
非阻塞体现于当发起一个异步调用后,不用等待而直接执行下一步的代码的状态,说明它现在的状态可以干别的,强调等结果时的状态。
异步体现于当发起一个异步调用后,不用等待而直接执行下一步的代码并且有结果的时候会通知的消息通知机制,说明它现在拿结果时会被通知而不用你一直等,强调拿到结果的方式。
单线程体现于我们写的node.js的事件循环和之后的回调函数都是在单线程的环境下执行的,而底层的线程池还是运用了多线程来处理我们的异步调用。
关于同步/异步和阻塞/非阻塞的例子:
同步阻塞:发起调用之后,没有返回,并且把线程挂起等返回和结果一起返回。
异步阻塞:发起调用之后,返回了并且也会通知结果返回,但把线程挂起等结果返回。
同步非阻塞:发起调用之后,没有返回,虽没把线程挂起只能一直等返回和结果一起返回。
异步非阻塞:发起调用之后,返回了并且也会通知结果返回,没有挂起线程所以可以去干别的事情。
调用后的返回和结果返回是不一样的,等调用后的返回和阻塞/非阻塞有关,调用后的结果返回和异步/同步有关。
(1)当发起一个异步(非阻塞或阻塞)调用时,就会封装异步调用的请求对象。
(2)封装完后的对象就会放入线程池内等待执行。
(3)当线程池查询有空时就会执行请求对象里面的I/O操作,执行完之后就会把结果封装到请求对象中并通知事件循环中的I/O观察者。
(4)I/O观察者就会取出请求对象的结果(也就是回调函数)进行执行。
每个特点的体现:
非阻塞体现于当发起一个异步调用后,不用等待而直接执行下一步的代码的状态,说明它现在的状态可以干别的,强调等结果时的状态。
异步体现于当发起一个异步调用后,不用等待而直接执行下一步的代码并且有结果的时候会通知的消息通知机制,说明它现在拿结果时会被通知而不用你一直等,强调拿到结果的方式。
单线程体现于我们写的node.js的事件循环和之后的回调函数都是在单线程的环境下执行的,而底层的线程池还是运用了多线程来处理我们的异步调用。
关于同步/异步和阻塞/非阻塞的例子:
同步阻塞:发起调用之后,没有返回,并且把线程挂起等返回和结果一起返回。
异步阻塞:发起调用之后,返回了并且也会通知结果返回,但把线程挂起等结果返回。
同步非阻塞:发起调用之后,没有返回,虽没把线程挂起只能一直等返回和结果一起返回。
异步非阻塞:发起调用之后,返回了并且也会通知结果返回,没有挂起线程所以可以去干别的事情。
调用后的返回和结果返回是不一样的,等调用后的返回和阻塞/非阻塞有关,调用后的结果返回和异步/同步有关。
相关文章推荐
- 理解Node.js的事件循环(代码是异步单线程,内部实现用的还是进程和线程,基于池化的线程实现异步)
- node.js 单线程异步理解
- 理解Node.js异步非阻塞I/O与传统线性阻塞IO的区别(转)
- 关于js中的单线程和异步事件同操作系统的生产者消费者模型的理解
- 理解Node.js异步非阻塞I/O模型
- 新手入门:理解Node.js的异步非阻塞I/O模型
- [转载]新手入门:理解Node.js的异步非阻塞I/O模型
- 理解Node.js的异步非阻塞I/O模型
- 关于[同步异步]和[阻塞非阻塞]的个人理解
- 个人对同步异步,阻塞非阻塞的理解
- 关于js 的 match函数的一点个人理解(jquery.form.js match)
- 如何理解Node.js中 单线程、非阻塞IO、事件驱动
- (五)、对于node.js的阻塞与非阻塞(优缺点)的理解
- 关于js异步加载的理解
- 关于 js 的 prototype , call,apply ,闭包,回调 个人浅显理解
- 关于线程方法的一些个人理解
- Node.js的学习历程二同步异步调用等基础知识的理解
- Spring特点中关于DI,IOC及AOP的个人理解
- 关于程序,进程,线程。程序个人理解:应用程序是一个车间,进程是一条生产线,线程是机器
- 关于js的异步调用思想理解——从C到js