Node.js 异步I/O

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cyan1614/article/details/73292194

异步I/O模型的基本要素有事件循环、观察者、请求对象和I/O线程池。


事件循环:

事件循环是Node.js的自身执行模型。

在进程启动时,Node.js便会创建一个类似while(true)的循环,每执行一个循环体的过程称为Tick。

每个Tick的过程就会查看是否有事件处理,如果有,就取出事件及其相关的回调函数。如果存在关联的回调函数,就执行它们。然后进入下一个循环,如果不再有事件处理,就退出进程。


观察者:

每个Tick如何判断是否有事件处理就需要引入观察者这个概念。每个事件循环中有一个或者多个的观察者,而判断是否有事件要处理的过程就是向这些观察者询问是否有要处理的事件。一个观察者可能有一个或者多个的事件。


请求对象:

从Javascript发起调用到内核执行完I/O操作的过渡过程中,存在一种中间产物,它叫请求对象。

从Javascript层传入的参数和当前方法都被封装在请求对象中并设置成参数和回调函数,对象包装完毕后会将对象推入线程池中等待执行。


整个异步I/O的流程:

组装好请求对象、送入I/O线程池等待执行,实际上完成了异步I/O的第一部分,第二部分是回调通知。线程池中I/O操作调用完毕之后,会将获取的结果储存在req->result属性上,然后通知IOCP,告知当前对象操作已经完成。然后向IOCP提交状态,并将线程归还线程池。提交之后,动用了事件循环的I/O观察者,在每次Tick的执行中,它会调用IOCP检查线程池是否有执行完的请求,如果存在,会将请求对象加入到I/O观察者的队列中,然后将其当做事件处理。I/O观察者回调函数的行为就是取出请求对象的result属性作为参数,取出oncomplete_sym属性作为方法,然后调用执行,以此达到调用Javascript中传入回调函数的目的。



猜你喜欢

转载自blog.csdn.net/Cyan1614/article/details/73292194
今日推荐