关于Node.js的运行机制的个人理解:
(1)当发起一个异步(非阻塞或阻塞)调用时,就会封装异步调用的请求对象。
(2)封装完后的对象就会放入线程池内等待执行。
(3)当线程池查询有空时就会执行请求对象里面的I/O操作,执行完之后就会把结果封装到请求对象中并通知事件循环中的I/O观察者。
(4)I/O观察者就会取出请求对象的结果(也就是回调函数)进行执行。
每个特点的体现:
非阻塞体现于当发起一个异步调用后,不用等待而直接执行下一步的代码的状态,说明它现在的状态可以干别的,强调等结果时的状态。
异步体现于当发起一个异步调用后,不用等待而直接执行下一步的代码并且有结果的时候会通知的消息通知机制,说明它现在拿结果时会被通知而不用你一直等,强调拿到结果的方式。
单线程体现于我们写的node.js的事件循环和之后的回调函数都是在单线程的环境下执行的,而底层的线程池还是运用了多线程来处理我们的异步调用。
关于同步/异步和阻塞/非阻塞的例子:
同步阻塞:发起调用之后,没有返回,并且把线程挂起等返回和结果一起返回。
异步阻塞:发起调用之后,返回了并且也会通知结果返回,但把线程挂起等结果返回。
同步非阻塞:发起调用之后,没有返回,虽没把线程挂起只能一直等返回和结果一起返回。
异步非阻塞:发起调用之后,返回了并且也会通知结果返回,没有挂起线程所以可以去干别的事情。
调用后的返回和结果返回是不一样的,等调用后的返回和阻塞/非阻塞有关,调用后的结果返回和异步/同步有关。