zoukankan      html  css  js  c++  java
  • Nodejs-非阻塞I/O&事件驱动

    1.关于es6变量  

      const 定义常量,不会发生改变的就用这个

      let 定义局部变量

    如:

      const fs=require('fs');//require()表示载入这个模块

      function aa(){

      for(var i=0;i<10;i++){}

    }

    这个i变量用var定义,就把i变成全局变量,导致在function aa()这个作用域块被污染了。可以用let定义它,这样不会造成污染,只会在for的作用域里面作用

      function aa(){

      for(let i=0;i<10;i++){}

    }

    2.非阻塞I/O(Node核心特性)&事件轮询

      Nodejs两个主要特点:单线程、非阻塞。  

      Node通过事件驱动的方式处理请求时无需为每一个请求创建额外的线程。在事件驱动的模型当中,每一个IO工作被添加到事件队列中,线程循环地处理队列上的工作任务,当执行过程中遇到来堵塞(读取文件、查询数据库)时,线程不会停下来等待结果,而是留下一个处理结果的回调函数,转而继续执行队列中的下一个任务。这个传递到队列中的回调函数在堵塞任务运行结束后才被线程调用。

      

      

       事件轮询模型

      

    如上图所示,每个异步函数执行结束后,都会在事件队列中追加一个事件(同时保存一些必要参数)。事件轮询下一次循环便可取出事件然后会调用异步方法对应的回调函数(参数)。这样一来,nodejs便能保证开发者编写的每行代码(每个回调)均在主线程中执行。注意这里有一个问题,如果开发者在回调函数中调用了阻塞方法,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。正因为这样,nodejs中的一些库方法均是异步的,也提倡用户调用异步方法。

  • 相关阅读:
    命令模式
    装饰者模式
    迭代器模式-统一集合的遍历方式
    springboot源码解析-管中窥豹系列之总体结构
    启动项目tomcat报错
    在项目中部署redis的读写分离架构(包含节点间认证口令)
    Redis的几个核心机制底层原理
    Java内存模型
    JAVA原子组件和同步组件
    DataGrid 删除一行数据
  • 原文地址:https://www.cnblogs.com/GumpYan/p/5795942.html
Copyright © 2011-2022 走看看