亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

事件驅(qū)動模型

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

當這個請求完成,它被放回處理隊列,當?shù)竭_隊列開頭,這個結(jié)果被返回給用戶。

這個模型非常高效可擴展性非常強,因為webserver一直接受請求而不等待任何讀寫操作。
(這也被稱之為非阻塞式IO或者事件驅(qū)動IO)

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

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

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

//引入events模塊
var events = require('events');
//創(chuàng)建eventEmitter對象
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ū)動模型我們就可以實現(xiàn)異步操作的。

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

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ā)事件,當然Node.js里面的許多對象都會分發(fā)事件,一個net.Server對象會在每次有新連接時也會分發(fā)一個事件, 所有這些產(chǎn)生事件的對象都是 events.EventEmitter 的實例。

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

為什么要這樣做呢?原因有兩點:

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

下面給大家分享我的第一個NodeJs項目

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

1.首先解壓縮

復制代碼 代碼如下:

tar xvf node-v4.2.3-linux-x64

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

復制代碼 代碼如下:

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文件夾下建個目錄叫mynodeproj,然后再建了個文件叫server.js(當然也可以起別的名字)

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í)行上述命令之后會在命令行中顯示"Server runnint at

因為我這個服務(wù)器是在阿里云里跑起來的,所以只要在外面的瀏覽器中鍵入阿里云IP+端口就可以訪問了。

相關(guān)文章

  • node.js中Buffer緩沖器的原理與使用方法分析

    node.js中Buffer緩沖器的原理與使用方法分析

    這篇文章主要介紹了node.js中Buffer緩沖器的原理與使用方法,結(jié)合實例形式分析了node.js Buffer緩沖器的基本概念、原理、創(chuàng)建、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 關(guān)于在mongoose中填充外鍵的方法詳解

    關(guān)于在mongoose中填充外鍵的方法詳解

    在學習非關(guān)系型數(shù)據(jù)庫mongoDB,希望能夠完成數(shù)據(jù)庫的CRUD,采用的是JS做的后臺,因此用到了mongoose,下面這篇文章主要給大家介紹了關(guān)于在mongoose中填充外鍵的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • npm?install總是卡住不動問題的解決辦法

    npm?install總是卡住不動問題的解決辦法

    在我們安裝完Node.js之后,需要使用npm命令來安裝一些工具,下面這篇文章主要給大家介紹了關(guān)于npm?install總是卡住不動問題的解決辦法,需要的朋友可以參考下
    2022-05-05
  • node連接redis的方法實現(xiàn)

    node連接redis的方法實現(xiàn)

    本文主要介紹了node連接redis的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • nodejs入門教程五:連接數(shù)據(jù)庫的方法分析

    nodejs入門教程五:連接數(shù)據(jù)庫的方法分析

    這篇文章主要介紹了nodejs入門教程之連接數(shù)據(jù)庫的方法,結(jié)合實例形式分析了nodejs連接數(shù)據(jù)庫的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • nodejs模塊系統(tǒng)源碼分析

    nodejs模塊系統(tǒng)源碼分析

    這篇文章主要介紹了nodejs模塊系統(tǒng)源碼分析,對nodejs感興趣的同學,可以參考下
    2021-05-05
  • Node.js事件的正確使用方法

    Node.js事件的正確使用方法

    這篇文章主要給大家介紹了關(guān)于Node.js事件的正確使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Node.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • NodeJs Express框架實現(xiàn)服務(wù)器接口詳解

    NodeJs Express框架實現(xiàn)服務(wù)器接口詳解

    最近學習了基于前后端分離的開發(fā)模式,我前端使用Vue框架,后端使用nodejs開發(fā)API接口,下面這篇文章主要給大家介紹了關(guān)于nodejs使用Express框架寫后端接口的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • node.js將MongoDB數(shù)據(jù)同步到MySQL的步驟

    node.js將MongoDB數(shù)據(jù)同步到MySQL的步驟

    這篇文章主要給大家介紹了關(guān)于node.js將MongoDB數(shù)據(jù)同步到MySQL的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。
    2017-12-12
  • Node.js如何自動審核團隊的代碼

    Node.js如何自動審核團隊的代碼

    在項目開發(fā)中,統(tǒng)一團隊的代碼風格很重要,本文介紹如何用Node.js來自動審核,來提高您的開發(fā)速度。
    2016-07-07

最新評論