Node中事件工作原理4.处理I/O任务handleIOTask:function(event){//当前线程v arcurThread=this;//操作数据库varoptDatabase=function( params,callback){varresult=readDataFromDb(params); callback.call(null,result)}//执行IO任务optDat abase(event.params,function(result){//返回结果存入事件对象中 event.result=result//IO完成后,将不再是耗时任务event. isIOTask=false//将该事件重新添加到队列的尾部this.globalEve ntQueue.push(event)//释放当前线程releaseThread(curT hread)})}/处理IO任务完成后将事件添加到队列尾部释放线程/Node中事 件工作原理Node.js本身是一个多线程平台,而它对JavaScript层面的任务处理是单线程的。Node中事件的实现 Node.js中大部分的模块,都继承自Event模块,Event模块(events.EventEmitter)是一个简单的事件监听 器模式的实现:事件示例1.绑定和触发事件constEventEmitter=require(''events'');/ /自定义一个对象继承于EventEmitterclassMyEmitterextendsEventEmitter{} constmyEmitter=newMyEmitter();myEmitter.on(''event'',function (){//添加事件监听器console.log(''触发了一个事件!'');});myEmitter.emit( ''event'');//触发指定事件事件示例2.为事件传递参数constEventEmitter=require( ''events'');classMyEmitterextendsEventEmitter{}constmyEmitte r=newMyEmitter();myEmitter.on(''event'',function(a,b){ console.log(a,b);});myEmitter.emit(''event'',''a'',''b'');Node有自身的事 件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录 了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/ O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制 ,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/ O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知 I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O 观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、 记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察 者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得 是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件 的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回 调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待 执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信 息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件 ,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/ O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程 可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事 件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行 完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出, Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对 应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会 修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是 以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O 线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对 象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱 动来实现异步I/O的教师:王晓玲QQ:4260924邮箱:4260924@qq. comNode.js开发主要内容异步函数定义异步与同步函数比较Node中的异步APINode中的 事件事件示例传统的同步函数传统的同步函数回调函数,采用按顺序的方式一步一步执行,例如:functioncooking( cb){console.log(''妈妈认真做饭'');if(cb&&typeofcb===''function''){ console.log(''小明快过来,开饭啦'')cb();}}functionread(){ console.log(''小明假装正在读书'');}functioneat(){console.log(''好的,我开动 咯'');}cooking(eat);read();运行结果:妈妈认真做饭小明快过来,开饭啦好的,我开动咯小明假装 正在读书异步函数的定义在回调函数执行时加入setTimeout之后,函数的执行顺序会发生变化吗?functionea t(){console.log(''好的,我开动咯'');}functioncooking(cb){consol e.log(''妈妈认真做饭'');setTimeout(function(){console.log(''小明快过 来,开饭啦'')cb();},1000);}functionread(){console.log('' 小明假装正在读书'');}cooking(eat);read();运行结果:妈妈认真做饭小明假装正在读书小明快过来,开 饭啦好的,我开动咯异步函数的定义基本的方法就是,在函数定义里面调用提供的异步api(不管是原生的还是第三方的),自定义 的函数也就是个异步函数了:functionfoo(callback){你自己的代码;asyncFn( function(){varresult=你自己的代码;callback(re sult);});}定义一个函数foo,里面调用了一个异步函数asyncFn,在asyncFn运行完了之后调用fo o的回调函数callback,来对结果result进行处理。异步和同步比较1.异步函数functionfoo(callba ck){你自己的代码;asyncFn(function(){varresult =你自己的代码;callback(result);});}异步函数中通过回调函数对结果 result进行处理。2.同步函数functionfoo(){vara=3,b =2;returna+b;}varc=foo();console.log(c);//5传统的 同步函数需要返回一个结果,通过return语句实现Node中异步APInode中的非IO的异步API提供了四种方法,分别为se tTimeOut(),setInterval(),setImmediate()以及process.nextTick(),四种方法实 现原理相似,但达到的效果略有区别。它们的用法分别是:1.setTimeOut(function(){},1000);2.set Interval(function(){},1000);3.setImmediate(function(){});4.proc ess.nextTick(function(){});除在用法上的差异外,它们还有那些区别呢?Node中异步APInode .js的基于事件循环的事件模型,正是因为它才使得node.js中回调函数十分普遍,也正是基于此,node.js实现了单线程高效的异 步IO(这里说的单线程主要说的是执行javascript代码部分的线程,而异步IO部分node.js其实还是利用线程池去执行的)。 简单的讲就是,在node.js启动时,创建了一个类似while(true)的循环体,每次执行一次循环体称为一次tick,每个ti ck的过程就是查看是否有事件等待处理,如果有,则取出事件极其相关的回调函数并执行,然后执行下一次tick。所以,有如下代码:A( );B();C();Node中异步APINode中的事件循环逻辑如下:Node中异步APINode中的观察者:在每个 tick的过程中,如何判断是否有事件需要处理呢?观察者。每个事件循环中都有一个或者多个观察者,而判断是否有事件要处理的过程就是向 这些观察者询问是否有要处理的事件。事件循环是一个典型的生产者/消费者模型。异步I/O、网络请求等则是事件的生产者,源源不断为nod e提供事件,这些事件被传递到对应的观察者那里,时间循环从观察者那里取出事件并处理。Node中异步APINode中的请求对象: 请求对象是异步I/O过程中的重要中间产物,所有的状态都保存在这个对象上,包括送入线程池等待执行以及I/O操作完毕后的回调函数。N ode中异步API执行回调事件循环、观察者、请求对象、I/O线程池共同构成了node的异步I/O模型 的基本要素。Node中异步APIsetTimeOut(),setInterval(),setImmediate()以及pro cess.nextTik()三者的优先级三种观察者的优先级顺序是:idle观察者>>io观察者>check观察者setTime out采用的是类似IO观察者setImmediate采用的是check观察者process.nextTick()采用的是idl e观察者Node中异步APIprocess.nextTick()与setImmediate()和setTimeout()的区 别如下:1、原始代码:A();B();C();执行顺序Node中异步API2、process.nextTick() 执行效果,代码如下:A();process.nextTick(B);C();执行顺序Node中异步API3、setI mmediate()或者setTimeout()执行效果,代码如下:A();setImmediate(B);//或者setTi meout(B,0);C();执行顺序Node中异步API结论:process.nextTick(),效率最高,消费 资源小,但会阻塞CPU的后续调用;setTimeout(),精确度不高,可能有延迟执行的情况发生,且因为动用了红黑树,所以消耗 资源大;setImmediate(),消耗的资源小,也不会造成阻塞,但效率也是最低的。Node中事件Node.js在主 线程里维护了一个事件队列,当接到请求后,就将该请求作为一个事件放入这个队列中,然后继续接收其他请求。当主线程空闲时(没有请求接入时 ),就开始循环事件队列,检查队列中是否有要处理的事件,这时要分两种情况:如果是非I/O任务,就亲自处理,并通过回调函数返回到上 层调用;如果是I/O任务,就从线程池中拿出一个线程来处理这个事件,并指定回调函数,然后继续循环队列中的其他事件。Nod e中事件当线程中的I/O任务完成以后,就执行指定的回调函数,并把这个完成的事件放到事件队列的尾部,等待事件循环,当主线程再次 循环到该事件时,就直接处理并返回给上层调用。这个过程就叫事件循环(EventLoop),其运行原理如下图所示:Node 中事件Node.js被分为了四层,分别是应用层、V8引擎层、NodeAPI层和LIBUV层。应用层:即Ja vaScript交互层,常见的就是Node.js的模块,比如http,fsV8引擎层:即利用V8引擎来解析Jav aScript语法,进而和下层API交互NodeAPI层:为上层模块提供系统调用,一般是由C语言来实现,和操作系统 进行交互。LIBUV层:是跨平台的底层封装,实现了事件循环、文件操作等,是Node.js实现异步的核心。Node 中事件工作原理Node.js实现异步的核心是事件,也就是说,它把每一个任务都当成事件来处理,然后通过EventLoop 模拟了异步的效果,为了更具体、更清晰的理解和接受这个事实,下面我们用伪代码来描述一下其工作原理:1.定义事件队列(先进先出 (FIFO)的数据结构)/定义事件队列入队:push()出队:shift()空队列:len gth==0/globalEventQueue:[]Node中事件工作原理2.定义接收请求入口/ 接收用户请求每一个请求都会进入到该函数传递参数request和response/processHttpRe quest:function(request,response){//定义一个事件对象varevent =createEvent({params:request.params,//传递请求参数 result:null,//存放请求结果callback:function(){}//指定回调函数 });//在队列的尾部添加该事件globalEventQueue.push(event);}No de中事件工作原理3.定义EventLoopeventLoop:function(){//如果队列不为空,就继 续循环while(this.globalEventQueue.length>0){//从队列的头 部拿出一个事件varevent=this.globalEventQueue.shift(); //如果是耗时任务if(isIOTask(event)){//从线程池里拿出一 个线程varthread=getThreadFromThreadPool(); //交给线程处理thread.handleIOTask(event)}else {//非耗时任务处理后,直接返回结果varresult=handle Event(event);//最终通过回调函数返回给V8,再由V8返回给应用程序 event.callback.call(null,result);}}}/事件循环 主体,主线程择机执行循环遍历事件队列处理非IO任务处理IO任务执行回调,返回给上层/Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的 |
|