首页 > Web开发 > 详细

nodejs深入浅出读书笔记(三)

时间:2020-04-22 14:02:37      阅读:64      评论:0      收藏:0      [点我收藏+]

为什么要异步I/O

-  用户体验
-  资源分配
   1. 单线程同步编程会因I/O导致硬件资源得不到更有的使用
   2. 多线程也会因为编程中的死锁,状态同步等问题让人头痛
- nodejs给出的解决方案 
   1.利用单线程,原理多线程死锁,状态同步等问题
   2.利用异步I/O让单线程原理阻塞,更好的使用CPU
   3.提供了类似于前端浏览器中的web workers的子进程,process_child

技术分享图片

异步I/O与非阻塞I/O

 1.这种重复调用判断操作是否完成的技术交轮询
 2.事件轮询的几种方式
    a.read ==> 最原始,性能最低的一种

技术分享图片

    b.select模式,是在read基础上的一种改进

技术分享图片

    c.poll 相比select有所改进,采用的链表的方式避免数组长度的限制,其次它能避免不要的检查。但是当文件描述符较多时,他的性能是十分低下的

技术分享图片

    d.epoll效率最高的I/O事件通知机制,在进入轮询的时候没有检查到I/O就会进行休眠,直到事件发生将他唤醒。

技术分享图片

    e.kqueue 改方案与epoll相似,在freeBSD系统下存在

理想状态下的I/O

技术分享图片

node的异步I/O

  1. 事件循环 -- 这是node的执行模型,正是他才使得在node中的回调函数十分普遍
  2. node进程启动 > 创建一个while循环,> 循环过程为tick ==> 每个tick就是查询是否有事件待处理,如果有就取出事件及相关的回调函数。如果存在关联的回调函数就执行他们。
    然后进入下个循环,如果不再有事件处理,就退出进程。

技术分享图片
3.观察者 判断是否有事件需要处理
4.请求对象
5.执行回调

事件循环,请求对象,回调函数,I/O线程池构成了Node异步模型的基本要素

非I/O的异步API

  • setTimeout()、setInterval()、setImmediate()?process.nextTick()。
  • 优先权 process.nextTick() > setImmediate()
  • 视为了保证每轮循环都能较快的执行借宿,防止CPU占用过多而阻塞后续I/O

nodejs深入浅出读书笔记(三)

原文:https://www.cnblogs.com/Nelsen8/p/12751615.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!