将执行完成的结果放在请求对象中
设置参数和回调函数
事件循环,观察者,请求对象和I/O线程池这四者共同构成了异步I/O模型的基本要素
开始
异步调用
创建主循环
事件循环
取出回调函数和结果调用执行
发起异步调用
封装 请求对象
将请求对象放入线程池等待执行
结束
获取完成的I/O交给I/O观察者
通知 IOCP 调用完成
归还线程
线程池
从I/O观察者取到可用的请求对象
执行请求对象中的I/O操作
线程可用
注意: 请求对象是异步I/O过程的重要中间产物,所有的状态都保存在这个对象中。 Node的异步I/O是通过libuv实现的,libuv分别提供了自定义线程池(*nix平台下)和IOCP(windows平台下)这两种实现异步I/O的方式。 图中IOCP的作用有两点:一是创建请求对象,将请求参数,回调函数等信息封装到请求对象中;二是线程池中的I/O调用完成之后,系统会通知ICOP,IOCP会取得对应的请求对象,并将请求对象加入对对应的I/O观察者的队列中。 异步调用和事件循环都是运行在主线程中的,其实Node就是在事件循环下运行的,一旦事件循环结束,Node的主线程就会退出。