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


    为什么要异步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
  • 相关阅读:
    Flask 中的路由系统
    Flask 中内置的 Session
    Flask中的模板语言jinja2
    Flask 中的 5种返回值
    Redis快速入门
    动态实现前后台分页、翻页按钮、上一页、下一页、首页、末页
    bus.js非父子组件之间通讯
    vue中父子组件之间相互传值
    js实现加减乘除
    禁用微信分享
  • 原文地址:https://www.cnblogs.com/Nelsen8/p/12751615.html
Copyright © 2020-2023  润新知