文享日志

深入理解node异步

JavaScript Nodejs

发表于2017年11月08日20:07:50

1条评论 262次阅读

        Node本身执行模型是--事件循环。进程启动时,相当于创建了一个while循环,当循环中观察者发现有业务要处理,就进行处理。

        一般我们自己写的非异步回调函数有自己调用执行,但对于Node中的异步IO或者网络套接字来说,回调函数并不由用户自己来调用。以fs.open为例,当调用该函数时,JavaScript调用Node核心模块,核心模块调用C++内建模块,内建模块通过libuv进行系统调用。在调用过程中产生请求对象,fs.open与里面的参数被挂载到请求对象上,fs.open中的回调函数也被设置到请求对象的属性中。请求对象到达线程池中等待执行。执行之后,结果保存在某个属性中,然后通知上层,提交状态,归还线程池。这个过程中,事件循环的观察者会发现还有回调函数尚未处理,会将先前获取到的结果当参数传入回调函数中。

事件循环、观察者、请求对象、I/O线程池共同构成Node替补I/O模型的基本要素。


然后Node有4个异步API。setTimeout , setInterval ,setImmediate , process.nextTick.

setTimeout与setInterval与浏览器的一样。这里就不说了。

通常尽量使用下面这两种,因为更高效。上两种动用红黑树,下两种是数组或链表。

setImmediate与process.nextTick类似,使用也差不多,当二者同时使用,发现process.nextTick的优先级较高,这是因为时间循环对观察者的检查有先后顺序,process.nextTick属于idle观察者,setImmediate属于check观察者,idle观察者优先于check观察者。。


setImmediate将回调函数保存到链表,而process.nextTick使用数组保存。

👍 3  👎 0
共有1条评论
手可摘星辰
测试一下不行吗?

2017-11-08 21:44:43举报 回复

发表新评论

提交

广告展示

腾讯云推广 阿里云推广