zoukankan      html  css  js  c++  java
  • 十九、Node.js-非阻塞IO、异步以及 '事件驱动EventEmitter'解决异步

    1、Nodejs 的单线程 非阻塞 I/O 事件驱动

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

    2、异步方法获取不到数据的代码示例:

    var fs=require("fs");
     function getdata() {
        fs.readFile("./mime.json",function (err,data) {
            return data.toString()
        })
    }
    console.log(getdata());

    对应的控制台结果:

    3、Nodejs events 模块处理异步

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

    events对象:

    1 var event=require("events")
    2 console.log(event);

    打印结果:

    { [Function: EventEmitter]
      EventEmitter: [Circular],
      usingDomains: false,
      defaultMaxListeners: [Getter/Setter],
      init: [Function],
      listenerCount: [Function] }

    从上面我们可以看到,events里面有一个EventEmitter(事件触发器)对象

    EventEmitter举例:

     1 var event=require("events")
     2 var  EventEmitter=new event.EventEmitter();//实例化EventEmitter对象
     3 //监听和接收广播
     4 //监听名字是to_parent的广播
     5 EventEmitter.on("to_parent",function (data) {
     6     console.log('接收到了广播事件');
     7     console.log(data);
     8 })
     9 setTimeout(function () {//有的人也把广播和接收广播成为通知和订阅
    10     console.log('开始广播');
    11     //广播to_parent事件
    12 EventEmitter.emit("to_parent","这是广播的内容")
    13 },2000)

    4、通过事件驱动获取异步方法里面的数据:

     1 var fs=require("fs")
     2 var  events=require("events")
     3 var EventEmitter=new events.EventEmitter();
     4 function getData() {
     5     fs.readFile("./mime.json",function (err,data) {
     6         EventEmitter.emit("result",data);
     7     })
     8 }
     9 getData();
    10 EventEmitter.on("result",function (result) {
    11     console.log(result.toString());//我们可以在EventEmitter的回调函数里面执行我们需要异步方法返回数据的逻辑
    12 })
  • 相关阅读:
    CI框架(Codeigniter)总结
    ssh自动下载SFTP文件
    数据库设计原则
    Java代码性能优化的 39个细节
    quartz定时任务时间设置
    Myeclipse 反编译工具插件
    Maven -- 使用Myeclipse创建Maven项目
    详解Java Web项目启动执行顺序
    java web项目下的lib和build path 中jar包问题解惑
    java读取存在src目录下和存在同级目录下的配置文件
  • 原文地址:https://www.cnblogs.com/luzhanshi/p/10768285.html
Copyright © 2011-2022 走看看