最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析Node.js 事件循環(huán)

 更新時(shí)間:2015年12月20日 14:50:32   作者:chen2013  
Node.js 是單進(jìn)程單線程應(yīng)用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高,本文給大家介紹nodejs事件循環(huán)相關(guān)知識(shí),對(duì)此感興趣的朋友快來學(xué)習(xí)吧

Node.js 是單進(jìn)程單線程應(yīng)用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高。

(來源于Javascript是單線程又是異步的,但是這種語言有個(gè)共同的特點(diǎn):它們是 event-driven 的。驅(qū)動(dòng)它們的 event 來自一個(gè)異構(gòu)的平臺(tái)。)

Node.js 的每一個(gè) API 都是異步的,并作為一個(gè)獨(dú)立線程運(yùn)行,使用異步函數(shù)調(diào)用,并處理并發(fā)。

Node.js 基本上所有的事件機(jī)制都是用設(shè)計(jì)模式中觀察者模式實(shí)現(xiàn)。

Node.js 單線程類似進(jìn)入一個(gè)while(true)的事件循環(huán),直到?jīng)]有事件觀察者退出,每個(gè)異步事件都生成一個(gè)事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù).

事件驅(qū)動(dòng)模型

Node.js 使用事件驅(qū)動(dòng)模型,當(dāng)webserver接收到請(qǐng)求,就把它關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個(gè)web請(qǐng)求。

當(dāng)這個(gè)請(qǐng)求完成,它被放回處理隊(duì)列,當(dāng)?shù)竭_(dá)隊(duì)列開頭,這個(gè)結(jié)果被返回給用戶。

這個(gè)模型非常高效可擴(kuò)展性非常強(qiáng),因?yàn)閣ebserver一直接受請(qǐng)求而不等待任何讀寫操作。
(這也被稱之為非阻塞式IO或者事件驅(qū)動(dòng)IO)

在事件驅(qū)動(dòng)模型中,會(huì)生成一個(gè)主循環(huán)來監(jiān)聽事件,當(dāng)檢測(cè)到事件時(shí)觸發(fā)回調(diào)函數(shù)。

整個(gè)事件驅(qū)動(dòng)的流程就是這么實(shí)現(xiàn)的,非常簡(jiǎn)潔。有點(diǎn)類似于觀察者模式,事件相當(dāng)于一個(gè)主題(Subject),而所有注冊(cè)到這個(gè)事件上的處理函數(shù)相當(dāng)于觀察者(Observer)。

Node.js 有多個(gè)內(nèi)置的事件,我們可以通過引入 events 模塊,并通過實(shí)例化 EventEmitter 類來綁定和監(jiān)聽事件,如下實(shí)例:

//引入events模塊
var events = require('events');
//創(chuàng)建eventEmitter對(duì)象
var eventEmitter = new events.EventEmitter();
//創(chuàng)建事件處理程序
var connectHandler = function connected() {
 console.log('連接成功。');
 //觸發(fā)data_received事件 
 eventEmitter.emit('data_received');
}
//綁定connection事件處理程序
eventEmitter.on('connection', connectHandler);
//使用匿名函數(shù)綁定data_received事件
eventEmitter.on('data_received', function(){
 console.log('數(shù)據(jù)接收成功。');
});
//觸發(fā)connection事件 
eventEmitter.emit('connection');
console.log("程序執(zhí)行完畢。"); 

以上代碼輸出的結(jié)果是:

連接成功。

數(shù)據(jù)接收成功。

程序執(zhí)行完畢。

上述的結(jié)果正如你想的一樣,通過這種事件驅(qū)動(dòng)模型我們就可以實(shí)現(xiàn)異步操作的。

(例如,我們可以一邊讀取文件,一邊執(zhí)行其他命令,在文件讀取完成后,我們將文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)返回。這樣在執(zhí)行代碼時(shí)就沒有阻塞或等待文件 I/O 操作。這就大大提高了 Node.js 的性能,可以處理大量的并發(fā)請(qǐng)求。)

var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
 if (err){
 console.log(err.stack);
 return;
 }
 console.log(data.toString());
});
console.log("程序執(zhí)行完畢。"); 

以上代碼輸出的結(jié)果是:

程序執(zhí)行完畢。

input.txt的內(nèi)容。

從上述代碼可以看出fs.readFile可以分發(fā)事件,當(dāng)然Node.js里面的許多對(duì)象都會(huì)分發(fā)事件,一個(gè)net.Server對(duì)象會(huì)在每次有新連接時(shí)也會(huì)分發(fā)一個(gè)事件, 所有這些產(chǎn)生事件的對(duì)象都是 events.EventEmitter 的實(shí)例。

不過大多數(shù)時(shí)候我們不會(huì)直接使用 EventEmitter,而是在對(duì)象中繼承它。包括 fs、net、 http 在內(nèi)的,只要是支持事件響應(yīng)的核心模塊都是 EventEmitter 的子類。

為什么要這樣做呢?原因有兩點(diǎn):

首先,具有某個(gè)實(shí)體功能的對(duì)象實(shí)現(xiàn)事件符合語義, 事件的監(jiān)聽和發(fā)射應(yīng)該是一個(gè)對(duì)象的方法。
其次 JavaScript 的對(duì)象機(jī)制是基于原型的,支持 部分多重繼承,繼承 EventEmitter 不會(huì)打亂對(duì)象原有的繼承關(guān)系。

下面給大家分享我的第一個(gè)NodeJs項(xiàng)目

Node.js的安裝通常有兩種方式:自己編譯源代碼和使用編譯好的文件,我這里使用編譯好的文件
目前我的home目錄下有剛下載來的node-v4.2.3-linux-x64

1.首先解壓縮

復(fù)制代碼 代碼如下:

tar xvf node-v4.2.3-linux-x64

2.設(shè)置鏈接,設(shè)置鏈接的目的在于任何路徑都能夠用到node命令

復(fù)制代碼 代碼如下:

ln -s /home/node-v4.2.3-linux-x64/bin/node /usr/local/bin/node
ln -s /home/node-v4.2.3-linux-x64/bin/npm /usr/local/bin/npm

3.在home文件夾下建個(gè)目錄叫mynodeproj,然后再建了個(gè)文件叫server.js(當(dāng)然也可以起別的名字)

var http = require('http');
http.createServer(function (request, response) {
 //發(fā)送 HTTP 頭部 
 //HTTP 狀態(tài)值: 200 : OK
 //內(nèi)容類型: text/plain
 response.writeHead(200, {'Content-Type': 'text/plain'});
 //發(fā)送響應(yīng)數(shù)據(jù) "Hello World"
 response.end('Hello World\n');
}).listen(8888);
//終端打印如下信息
console.log('Server running at http://127.0.0.1:8888/'); 

4.使用node命令執(zhí)行以上代碼

node server.js

執(zhí)行上述命令之后會(huì)在命令行中顯示"Server runnint at

因?yàn)槲疫@個(gè)服務(wù)器是在阿里云里跑起來的,所以只要在外面的瀏覽器中鍵入阿里云IP+端口就可以訪問了。

相關(guān)文章

  • Nodejs連接mysql并實(shí)現(xiàn)增、刪、改、查操作的方法詳解

    Nodejs連接mysql并實(shí)現(xiàn)增、刪、改、查操作的方法詳解

    這篇文章主要介紹了Nodejs連接mysql并實(shí)現(xiàn)增、刪、改、查操作的方法,結(jié)合實(shí)例形式詳細(xì)分析了nodejs針對(duì)mysql數(shù)據(jù)庫的的連接、mysql數(shù)據(jù)庫的創(chuàng)建及nodejs針對(duì)mysql增刪改查等相關(guān)操作具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Koa 使用小技巧(小結(jié))

    Koa 使用小技巧(小結(jié))

    這篇文章主要介紹了Koa 使用小技巧(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • node.js+postman實(shí)現(xiàn)模擬HTTP服務(wù)器與客戶端交互

    node.js+postman實(shí)現(xiàn)模擬HTTP服務(wù)器與客戶端交互

    本文主要介紹了node.js+postman實(shí)現(xiàn)模擬HTTP服務(wù)器與客戶端交互,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解nodejs中的異步迭代器

    詳解nodejs中的異步迭代器

    這篇文章主要介紹了nodejs中的異步迭代器,對(duì)異步感興趣的同學(xué),可以參考下
    2021-05-05
  • Node.js使用Sharp.js進(jìn)行圖像處理的實(shí)踐與技巧

    Node.js使用Sharp.js進(jìn)行圖像處理的實(shí)踐與技巧

    Sharp.js 是一個(gè)高性能的 Node.js 圖像處理庫,基于 C 語言編寫的 libvips 庫封裝而來,提供了便捷、高效的圖片編輯與轉(zhuǎn)換功能,以下是對(duì) Sharp.js 的深入解析,包括全方位實(shí)踐與技巧,需要的朋友可以參考下
    2024-08-08
  • node中的__filename和__dirname的使用詳解

    node中的__filename和__dirname的使用詳解

    本文主要介紹了node中的__filename和__dirname的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 使用Redis和Node.js來開發(fā)簡(jiǎn)單的實(shí)時(shí)聊天功能

    使用Redis和Node.js來開發(fā)簡(jiǎn)單的實(shí)時(shí)聊天功能

    在眾多實(shí)時(shí)通信的技術(shù)中,Redis和Node.js的結(jié)合是一種非常強(qiáng)大和流行的選擇,Redis是一種高性能的鍵值存儲(chǔ)數(shù)據(jù)庫,而Node.js是一個(gè)基于事件驅(qū)動(dòng)的JavaScript運(yùn)行時(shí)環(huán)境,兩者的結(jié)合可以輕松實(shí)現(xiàn)實(shí)時(shí)聊天功能,本文將指導(dǎo)您使用Redis和Node.js來開發(fā)一個(gè)簡(jiǎn)單的實(shí)時(shí)聊天功能
    2024-08-08
  • Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime 庫進(jìn)行日期格式化的實(shí)現(xiàn)方法

    Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime

    這篇文章主要介紹了Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime 庫進(jìn)行日期格式化的實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了express框架引入EJS模版以及導(dǎo)入 silly-datetime 庫的格式化方法傳遞給EJS模版使用的相關(guān)操作技巧,需要的朋友可以參考下
    2023-05-05
  • nvm mac 環(huán)境搭建過程

    nvm mac 環(huán)境搭建過程

    這篇文章主要為大家介紹了nvm mac 環(huán)境搭建過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • pm2啟動(dòng)ssr失敗的解決方法

    pm2啟動(dòng)ssr失敗的解決方法

    這篇文章主要介紹了pm2啟動(dòng)ssr失敗的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

固安县| 哈尔滨市| 阳信县| 桐梓县| 东乌| 雷州市| 双流县| 安义县| 甘谷县| 上蔡县| 潞城市| 图们市| 乌苏市| 东乡县| 铜鼓县| 大冶市| 余庆县| 个旧市| 洛川县| 托克逊县| 苏尼特左旗| 永靖县| 阿坝县| 禄丰县| 读书| 衡南县| 桃江县| 汶上县| 南靖县| 桃园市| 玉门市| 会泽县| 景德镇市| 睢宁县| 册亨县| 四会市| 新兴县| 芷江| 宾阳县| 中卫市| 抚州市|