码迷,mamicode.com
首页 > 其他好文 > 详细

深入浅出node读书笔记(三)

时间:2016-01-09 23:02:04      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

  介绍完了node的模块机制,现在来说说node的一个非常有名的特色:异步I/O.

  (1)首先我们先要了解一下node自身的执行模型:事件循环.它使得回调函数十分普遍。在启动进程的时候,node创建一个类似于while(true)循环的循环体,每执行一次循环体我们成为一次tick。每个tick的过程就是查看是否有事件需要处理,如果有就看它是否有关联的回调函数,如果有,就执行回调函数,没有就进入下一个循环。直到没有事件为止,就退出流程。

                                  技术分享

      此外,每个事件循环均有一个或者多个观察者,node可向其询问是否有事件需要处理。

  (2)node的事件的请求对象:

技术分享

   如上图所示,在JavaScript发送异步请求后,创建了一个请求对象,从js层传过来的参数和相关方法(包括回调函数)都被封装到了这个对象里面,对象包装完毕后放入线程池等待执行。如果线程池里面有线程可用,即可执行请求对象中的I/O操作,并将执行完的结果放到请求对象中,通知IOCP调用完成,然后回到node的事件循环里面,等待回调函数执行。

  (3)非I/O的异步api:setTimeout(),setInterval(),setImmediate(),process.nextTick()

    ①setTimeout()与setInterval():调用这两个函数创建的定时器会被插入到定时器观察者内部的一个红黑树中,每次tick执行时候都会从红黑树中迭代取出定时器对象。

    ②process.nextTick():将回调函数延迟至下一次tick执行,不需要调用红黑树以及迭代过程,效率较高。

    ③setImmediate():将回调函数放到下一次tick执行。

  总结:但与process.nextTick()有区别。②的优先级高于③,因为二者所属的观察者不同。同时在具体表现上,如果多次调用对应函数,②的回调函数放在了一个数组中,下次tick全部执行一遍,而③的回调函数放在一个链               表中,每次只能执行一个。

 

深入浅出node读书笔记(三)

标签:

原文地址:http://www.cnblogs.com/jakii/p/5117414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!