作者:mobiledu2502907423 | 来源:互联网 | 2024-09-30 21:00
node的特点:它作为js的运行平台,node保留了前端浏览器js那些熟悉的接口,依旧基于作用于和原型链,区别在于它将前端中广泛应用的思想迁移到服务器。异步IO:关键字:异
node的特点:它作为js的运行平台,node保留了前端浏览器js那些熟悉的接口,依旧基于作用于和原型链,区别在于它将前端中广泛应用的思想迁移到服务器。
异步I/O:
关键字 : 异步,阻塞,回调,事件
why:前端通过异步可以消除UI阻塞的现象;前端获取资源的速度也取决与后端的响应速度,采用异步获取的速度更快。
eg: 面对两个相同的两个事件:
同步:事件一请求结束后才允许第二个事件请求。
异步:事件二的请求并不阻塞第二个资源,也就是第二个事件的请求并不会依赖事件一的结束,这样就可以享受并发的优势。
how:
node采用 单线程资源分配方式
node选择:
利用单线程,远离多线程死锁,状态同步等问题 ;
利用异步I/O的方式,让单线程远离阻塞,以更好的使用CPU。
node的异步I/O
单线程 事件循环 观察者 I/O线程池 请求对象
事件循环
它是node的自身执行模式,在进程启动的时候,node创建一个while(ture)循环–Tick,每个Tick就是查看是否有事件待处理,如果有,请求相应的回调函数进行处理,如果不再有事件处理,就退出进程。
观察者
观察者用来判断是否還有事件要处理。每个事件中有一个或者多个观察者,判断是否有事件要处理,就是向这些观察者询问是否有要处理的事件。
请求对象
请求对象是从JS发起调用到内核执行完成I/O操作过渡过程的一种中间产物,所有对象都保存在这个对象中,包括送入线程池等待以及I/O操作完毕后的回调处理。
执行回调线程池中的I/O操作调用完毕,将获取的结果存储在req->result属性上。然后调用PostQueuedCompletionStatus(),告知对象操作已经完成,此方法之后会将线程归还线程池,然后提交状态。通过get()方法提取。
整个过程
异步调用(发起 ——封装请求对象——设置参数和回调函数——请求对象放入线程池等待)——线程池(执行请求I/O操作——将执行结果放在请求对象中——通知完成操作)——事件循环(获取完成的I/O交给I/O观察者——从观察者获取可用的请求对象——取出回调函数和结果调用执行——获取完成的I/O交给I/O观察者)
非I/O的异步API
- 定时器
setTimeout();
setInterval();
- process.nextTick
- setImmediate
(未完待续)