十9、Node.js-非阻塞IO、異步以及 '事件驅動EventEmitter'解決異步

一、Nodejs 的單線程 非阻塞 I/O 事件驅動

在 Java、PHP 或者.net 等服務器端語言中,會爲每個客戶端鏈接建立一個新的線程而每一個線程須要耗費大約 2MB 內存。也就是說,理論上,一個 8GB 內存的服務器能夠同鏈接的最大用戶數爲 4000 個左右。要讓 Web 應用程序支持更多的用戶,就須要增長服務的數量,而 Web 應用程序的硬件成本固然就上升了。Node.js 不爲每一個客戶鏈接建立一個新的線程,而僅僅使用一個線程。當有用戶鏈接了就觸發一個內部事件,經過非阻塞 I/O、事件驅動機制,讓 Node.js 程序宏觀上也是並行的。使用 Node.js,一個 8GB 內存的服務器,能夠同時處理超過 4 萬用戶的鏈接json

二、異步方法獲取不到數據的代碼示例:

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

對應的控制檯結果:服務器

三、Nodejs events 模塊處理異步

Node.js 有多個內置的事件,咱們能夠經過引入 events 模塊,並經過實例化 EventEmitter
類來綁定和監聽事件。異步

events對象:函數

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

打印結果:ui

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

從上面咱們能夠看到,events裏面有一個EventEmitter(事件觸發器)對象spa

EventEmitter舉例:.net

 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)

四、經過事件驅動獲取異步方法裏面的數據:線程

 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 })
相關文章
相關標籤/搜索