非阻塞式IO与事件循环

    技术2022-07-11  79

    我们首先要明确两点: 1、Node是多线程的JS运行环境,JS代码运行在主线程上 2、Node中有很多不同类型的观察者,例如I/O观察者、网络请求观察者,这些观察者负责监听不同类型的事件,它们会不停取出可用的请求对象,执行请求对象上挂载的回调函数。

    请求对象:从JS发起调用到内核执行完成I/O操作的过渡过程中,有一种中间产物贯穿其中,它就是请求对象,请求对象由操作系统API产生。

    理想的非阻塞I/O模型是: 1、应用层发起异步调用之后立即交还主线程,用以继续执行JS代码; 2、当系统内核完成数据获取后,会以事件/信号的形式通知主线程并将数据交给回调函数; 3、主线程接到通知,调用异步回调。

    理想的模型是以单线程的场景为前提的,实现理想模型的只有Linux系统,实际的I/O模型实现是多线程协调的结果

    从发起异步调用到执行回调主要分为两步: 1、组装好请求对象——将回调函数挂载到请求对象的oncomplete_sym属性上,推入I/O线程池等待执行

    req_wrap->object_->Set(oncomplete_sym,callback);

    2、将获取的数据挂载到请求对象的result属性上,更改请求对象执行状态,将请求对象推入事件循环,由观察者取出请求对象,将result传入oncomplete_sym并执行oncomplete_sym

    事件循环图:

    Processed: 0.014, SQL: 9