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

解析NodeJS異步I/O的實現(xiàn)

 更新時間:2017年04月13日 11:17:15   作者:彭澤0902  
本篇文章主要介紹了解析NodeJS異步I/O的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在現(xiàn)在的項目開發(fā)中,任何一個大型項目絕對不是簡簡單單的采用一個種語言和一種框架,因為每種語言和框架各有優(yōu)勢,與其死守一個,不與取各家之所長,依次得到一個高性能、搞擴展的產(chǎn)品。

對于一個.NET開發(fā)者,尤其是主要從事Web開發(fā)的.NET程序員,個人覺得有必要學(xué)習一門性能優(yōu)越的Web平臺開發(fā)語言。一個開發(fā)者不能簡簡單單的只學(xué)習一門語言,思維應(yīng)該開闊,從各個方面去看待同樣的一個問題,這樣或許會得到另一番效果和見解,個人認為應(yīng)該學(xué)習一下其他的語言,這樣有利于我們對比語言的優(yōu)勢和缺點,例如java、nodejs、python等等。對于Nodejs這個JavaScript平臺,個人覺得.NET程序員有必要學(xué)習一下,因為學(xué)習NodeJS有助于我們構(gòu)建一個高性能的Web平臺。

NodeJS具有事件驅(qū)動、非阻塞I/O等特點,可以很好的處理I/O操作。Node面向網(wǎng)絡(luò)且擅長并行I/O,能夠有效地組織起更多的硬件資源。

這篇博客就來簡單的介紹一下NodeJS的異步I/O特點。

一.NodeJS概述:

要學(xué)習一個語言或者平臺,我們首先應(yīng)該知道其定義,依據(jù)定義來擴展我們的學(xué)習思路。Node的定義:”一個大獎在Chrome JavaScript運行時上的平臺,用于構(gòu)建高速、可伸縮的網(wǎng)絡(luò)程序。NodeJS作為一個異步事件驅(qū)動的JavaScript運行時,旨在構(gòu)建可擴展的網(wǎng)絡(luò)應(yīng)用程序。“有關(guān)nodejs的背景介紹和安裝方法,這里就沒有必要介紹了,因為對于nodejs的安裝是比較簡單,所以在這里贅述就有些顯得浪費時間。

學(xué)習完Node的定義特點,可能很多人都會好奇這個平臺的適用場景是什么,以便在實際的項目開發(fā)中應(yīng)用,不然學(xué)習這個就沒有意義。主要的應(yīng)用場景:前后端編程語言環(huán)境統(tǒng)一;高性能I/O用于實時應(yīng)用;并行I/O使得使用者可以更高效地利用分布式環(huán)境;并行I/O有效利用穩(wěn)定接口提升Web渲染能力;云平臺的支持;游戲開發(fā)(這可能是很多開發(fā)者在意的,畢竟現(xiàn)在的游戲開發(fā)火熱程度已經(jīng)到了無以附加的地步);工具類應(yīng)用,與較多的工具方法,使得開發(fā)效率大大的提升。

NodeJS異步I/O模型的基本要素:事件循環(huán)、觀察者、請求對象、I/O線程池這四個共同構(gòu)成。接下來我們具體了解一下這些知識。

二.NodeJS異步I/O解析:

對于Nginx服務(wù)器,很多人都是比較的熟悉,Nginx采用純C編寫而成,用于做Web服務(wù)器,在反向代理和負載均衡等服務(wù)方面有很好的優(yōu)勢。Node與Nginx服務(wù)器有著相似的地方,都是采用事件驅(qū)動。

瀏覽器中JavaScript在單線程上執(zhí)行,而且還與UI渲染共用一個線程,JavaScript在執(zhí)行的時候UI渲染和響應(yīng)應(yīng)是出于停滯狀態(tài)。(如果腳本執(zhí)行的時間超過100毫秒,用戶就會感到頁面卡頓)。遇到這些情況,我們就會想到異步的方式消除這些等待的問題,對于異步和同步的概念就不做介紹了。

=接下來我們具體的來了解一下NodeJS的事件驅(qū)動和非阻塞I/O這些特點,了解這些對于我們更好的學(xué)習NodeJS開發(fā)和構(gòu)建高性能的Web平臺有更加深遠的意義。

1.I/O操作概述:

I/O操作對于任何一個開發(fā)者來說都不會陌生,現(xiàn)在我們就簡單的談一下NodeJS的I.O操作。I/O操作分為:單線程串行依次執(zhí)行;多線程并行執(zhí)行。這兩種方式各有優(yōu)勢和缺點,多線程的代價在于創(chuàng)建線程和執(zhí)行期線程上下文切換的開銷較大,并且多線程面臨鎖、狀態(tài)同步的問題。單線程安裝順序執(zhí)行,在執(zhí)行中任何一個稍慢都會導(dǎo)致后續(xù)執(zhí)行代碼阻塞。對于任務(wù)的串行執(zhí)行(概念上類似于同步執(zhí)行)和任務(wù)的并行執(zhí)行的描述有如下圖:

                       

在NodeJS中利用單線程,遠離死鎖、狀態(tài)同步問題,利用異步I/O,讓單線程遠離阻塞,以便更好的使用CPU。異步I/O是期望I/O的調(diào)用不再阻塞后續(xù)運算,將原有等待I/O完成這段時間分配給其他需要的業(yè)務(wù)去執(zhí)行?!  ?/p>

很多時候一些開發(fā)者對異步/同步和阻塞/非阻塞的概念有些分不清,這兩者沒有什么關(guān)聯(lián)。阻塞I/O是調(diào)用之后一定要等到系統(tǒng)內(nèi)核層面完成所有操作后,調(diào)用才結(jié)束。非阻塞I/O是在調(diào)用后立即返回。關(guān)于阻塞I/O和非阻塞I/O有如下圖:

 

2.NodeJS異步I/O解析:

事件循環(huán):在進程啟動時,Node會創(chuàng)建一個類似于while(true)的循環(huán),每執(zhí)行一次循環(huán)體的過程稱為Tick,每個Tick的過程就是查看是否有時間待處理。

觀察者:每個時間循環(huán)中有一個或多個觀察者,判斷是否有事件要處理的過程就是向這些觀察者詢問是否又要處理的事件。

請求對象:從JavaScript發(fā)起調(diào)用到內(nèi)核執(zhí)行完I/O操作的過渡過程中,存在一種中間產(chǎn)物,就是請求對象。

I/O線程池:組裝好請求、送入I/O線程池等待執(zhí)行,完成第一步I/O操作,進入第二部分回調(diào)通知。(在Windows中,線程池中的I/O操作調(diào)用完畢之后,會將獲取的結(jié)果存在req->result屬性上,然后調(diào)用PostQueuedCompletionStatus()通知IOCP,告知當前對象操作已經(jīng)完成。)

異步I/O有如下圖:

三.NodeJS異步編程實例:

前面介紹了異步I/O的相關(guān)概念,這里提供一個異步I/O操作的實例:

var config = require('./config.json');
var fs = require("fs");
var http = require('http');
var url_module = require("url");

http.createServer(function (request, response) {
  var key = url_module.parse(request.url).query.replace('key=', '');
  switch (request.method) {
    case 'GET': // Asynchronous Response Generation
      fs.readFile(config.dataPath + key, 'utf8', function(err, value) {
        if (err) {
          // Return File Not Found if file hasn't yet been created
          response.writeHead(404, {'Content-Type': 'text/plain'});
          response.end("The file (" + config.dataPath + key + ") does not yet exist.");
        } else {
          // If the file exists, read it and return the sorted contents
          var sorted = value.split(config.sortSplitString).sort().join('');
          response.writeHead(200, {'Content-Type': 'text/plain'});
          response.end(sorted);
        }
      });
      break;
    case 'POST': // Synchronously append POSTed data to a file
      var postData = '';
      request
        .on('data', function (data) {
          postData += data;
        })
        .on('end', function () {
          fs.appendFile(config.dataPath + key, postData, function(err) {
            if (err) {
              // Return error if unable to create/append to the file
              response.writeHead(400, {'Content-Type': 'text/plain'});
              response.end('Error: Unable to write file: ' + err);
            } else {
              // Write or append posted data to a file, return "success" response
              response.writeHead(200, {'Content-Type': 'text/plain'});
              response.end('success');
            }
          });
        });
      break;
    default:
      response.writeHead(400, {'Content-Type': 'text/plain'});
      response.end("Error: Bad HTTP method: " + request.method);
  }
}).listen(config.serverPort);

console.log('synchronous server is running: ', config.serverPort);

四.總結(jié):

這篇博文是個人初次嘗試NodeJS的一個小總結(jié),如有寫的不好還望大家多多的包含和指正。對于程序員來說,需要做的就是一直不停的學(xué)習,無論是否是自己主要從事的語言,對于學(xué)習多種語言,可以更加有助我們了解編程,對于一個開發(fā)者來說,最終的就是思想,因為語言的特性和框架的應(yīng)用,一個熟練的編程者學(xué)習起來并不是難事,難就難在我們對于語言和框架的設(shè)計理念的理解。

相關(guān)文章

  • Node.js中的進程間通信

    Node.js中的進程間通信

    這篇文章主要介紹了Node.js中的進程間通信,文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • NodeJS學(xué)習筆記之Module的簡介

    NodeJS學(xué)習筆記之Module的簡介

    模塊是Node.js 應(yīng)用程序的基本組成部分,文件和模塊是一一對應(yīng)的。換言之,一個 Node.js 文件就是一個模塊,這個文件可能是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴展。
    2017-03-03
  • Node.js利用console輸出日志文件的方法示例

    Node.js利用console輸出日志文件的方法示例

    本篇文章主要介紹了Node.js利用console輸出日志文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • windows離線環(huán)境安裝node-sass全過程

    windows離線環(huán)境安裝node-sass全過程

    文章介紹了如何在Windows系統(tǒng)上安裝和配置node-sass,并提供了一個詳細的步驟指南,首先,通過命令行查看支持版本;然后,下載對應(yīng)版本的node-sass安裝包;接著,在npm配置文件中增加SASS_BINARY_PATH路徑配置;最后,執(zhí)行npmi命令完成安裝
    2024-12-12
  • npm發(fā)包實踐使用gRPC教程

    npm發(fā)包實踐使用gRPC教程

    這篇文章主要為大家介紹了npm發(fā)包實踐使用gRPC教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • node環(huán)境下運行js代碼缺少window環(huán)境的原因以及解決方法

    node環(huán)境下運行js代碼缺少window環(huán)境的原因以及解決方法

    Node是一個基于Chrome?V8引擎的運行環(huán)境,讓JavaScript運行在服務(wù)端的開發(fā)平臺,這篇文章主要給大家介紹了關(guān)于node環(huán)境下運行js代碼缺少window環(huán)境的原因以及解決方法,需要的朋友可以參考下
    2023-11-11
  • node.js中的fs.lchownSync方法使用說明

    node.js中的fs.lchownSync方法使用說明

    這篇文章主要介紹了node.js中的fs.lchownSync方法使用說明,本文介紹了fs.lchownSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js 路由的實現(xiàn)方法

    Node.js 路由的實現(xiàn)方法

    這篇文章主要介紹了Node.js 路由的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-06-06
  • node.js+express制作網(wǎng)頁計算器

    node.js+express制作網(wǎng)頁計算器

    這篇文章主要介紹了node.js+express制作網(wǎng)頁計算器的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • node.js中的require使用詳解

    node.js中的require使用詳解

    本文通過幾個具體實例來分析講解了node.js中require的使用方法,非常的詳盡,這里推薦給大家
    2014-12-12

最新評論

虎林市| 林州市| 利辛县| 绵竹市| 昌都县| 普安县| 皋兰县| 吴旗县| 富平县| 江达县| 临清市| 从化市| 临江市| 屯门区| 白银市| 伽师县| 来宾市| 滕州市| 南昌县| 昌都县| 五大连池市| 延边| 改则县| 崇阳县| 平定县| 潼南县| 拜泉县| 英德市| 陇西县| 东明县| 徐州市| 上高县| 河池市| 黄梅县| 宜川县| 桑日县| 海阳市| 盖州市| 桐柏县| 盐源县| 那曲县|