zoukankan      html  css  js  c++  java
  • Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动

    1Nodejs 的单线程 非阻塞 I/O 事件驱动
    JavaPHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。
    而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时
    连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器
    的数量,而 Web 应用程序的硬件成本当然就上升了。
    Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程。当有用户连接了,
    就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。
    使用 Node.js一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接
    2Nodejs 回调处理异步

    /错误的写法:
    function getData(){
    //模拟请求数据
    var result='';
    setTimeout
    (function(){
    result='这是请求到的数据'
    },200);
    return result;
    }
    console.log(getData());/*异步导致请求不到数据*/
    
    //正确的处理异步:
    function getData(callback){
    //模拟请求数据
    var result='';
    setTimeout
    (function(){
    result='这是请求到的数据';
    callback(result);
    },200);
    }
    getData(function(data){
    console.log(data);
    })
    

    3Nodejs events 模块处理异步
    Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter类来绑定和监听事件。
     

    // 引入 events 模块
    var events = require('events');
    var EventEmitter=new events.EventEmitter(); /*实例化事件对象*/
    EventEmitter.on
    ('toparent',function(){
    console.log('接收到了广播事件');
    })
    setTimeout
    (function(){
    console.log('广播');
    EventEmitter.emit
    ('toparent'); /*发送广播*/
    },1000)
    
    Node.js 事件循环
    /*
     Node.js 事件循环:
    
     Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
    
     Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
    
     Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,
    
     */
    
    // 引入 events 模块
    var events = require('events');
    
    var EventEmitter = new events.EventEmitter();
    
    //监听to_mime的广播
    EventEmitter.on('to_mime', function (data) {
      console.log(data, '接收to_mime的数据');
    })
    
    //监听to_parent的广播
    EventEmitter.on('to_parent', function (data) {
      console.log(data, '接收to_parent的数据');
      //广播to_mime事件
      EventEmitter.emit('to_mime', '发送to_mime的数据')
    })
    
    setTimeout(function () {
      console.log('开始广播...');
      //广播to_parent事件
      EventEmitter.emit('to_parent', '发送to_parent的数据')
    }, 1000);
    

    执行结果

    开始广播...
    发送to_parent的数据 接收to_parent的数据
    发送to_mime的数据 接收to_mime的数据
  • 相关阅读:
    linux安装git
    安装tidb数据库
    docker的简单操作和端口映射
    zabbix的简单操作(查看监控,自定义监控和钉钉监控报警)
    zabbix简单的操作(添加主机)
    LINQ 函数的实战演练测试
    C#基础:LINQ 查询函数整理
    C#中的LINQ
    C#高级编程笔记 2016年10月26日 MVC入门 Controller
    委托、Lambda表达式和事件
  • 原文地址:https://www.cnblogs.com/chenyablog/p/9849796.html
Copyright © 2011-2022 走看看