NODE核心概念 (1) - 同步I/O與異步I/O

Node.js自誕生之日起就以起高并發(fā)得名嗜价,其中的核心便是異步I/O了艇抠。那么到底什么是異步I/O?和傳統(tǒng)的同步I/O比又有什么優(yōu)點(diǎn)炭剪?讓我們從簡單的概念講起吧练链。

同步I/O

在操作系統(tǒng)中我們都學(xué)過,線程執(zhí)行在遇到I/O操作的時候會被阻塞奴拦。然后CPU轉(zhuǎn)而去處理該I/O操作媒鼓,得出結(jié)果后再返回該線程繼續(xù)執(zhí)行下去。這就是傳統(tǒng)意義上得同步I/O错妖,也是在編程中非常直觀的方式绿鸣。假設(shè)我們有一個名為"test.txt"的文件,下面讓我們寫一個讀取文件的小例子:

// fs是node的file system
var fs = require('fs');

//  sync指明同步I/O方式
var data = fs.readFileSync('test.txt', 'utf-8');

console.log(data);
console.log('end of program.');

可以預(yù)見暂氯,該程序先讀取test文件的內(nèi)容并顯示在終端上潮模,然后打印一行end of program作為程序的結(jié)束。一般程序都是這么線性執(zhí)行的痴施,理解起來也非常容易擎厢。這么執(zhí)行有什么問題?

問題

這樣的線程執(zhí)行方式在一般情景下是完全沒有問題的辣吃,但我們將場景切換到互聯(lián)網(wǎng)上來看动遭。傳統(tǒng)服務(wù)器的處理方式是為每個請求開啟一個線程,在遇到I/O請求的時候就按上面說的同步方式來坐阻塞處理神得。但每個CPU能承受的線程數(shù)是有限制的厘惦,于是達(dá)到限制的時候就必須添加新的CPU。何況開啟線程是非常消耗資源的哩簿,訪問量教大的互聯(lián)網(wǎng)應(yīng)用宵蕉,服務(wù)器擴(kuò)展的速度可能會遠(yuǎn)遠(yuǎn)超過你的想象。

策略

那么有其他的解決方法么节榜?從上面的模型上來開羡玛,瓶頸主要是在阻塞上。于是異步I/O的概念就此誕生了宗苍。與同步想法稼稿,異步方式在遇到I/O操作時不阻塞線程亿遂,而是將I/O請求發(fā)給后臺執(zhí)行,然后線程繼續(xù)執(zhí)行下去渺杉。直到I/O操作完成后再通知線程來處理結(jié)果。于是線程的利用率就很高了挪钓,單個線程就能處理大量的請求是越。下面來看看異步方式I/O到底是什么樣的:

var fs = require('fs');

// node默認(rèn)是異步處理凡事
fs.readFile('test.txt', 'utf-8', function(err, data) {  
// 讀取出錯則打印出錯信息,否則打印文件內(nèi)容
if (err) {
    console.log(err);
} else {
    console.log(data);
}
});
console.log('end of program.');

這個程序的執(zhí)行結(jié)果又是什么碌上?這次不再是先打印文件內(nèi)容了倚评,而是先打印了end of program,然后才是文件內(nèi)容馏予。就像上面提到的天梧,但程序執(zhí)行到讀取文件這個I/O操作的時候,不會再阻塞并等待了霞丧。去讀操作被交給后臺去處理呢岗,而線程繼續(xù)執(zhí)行下去,也就是執(zhí)行后面的end of program這條指令蛹尝。文件讀取完成后再打印文件的內(nèi)容后豫。

缺點(diǎn)

看起來好像異步方式是個非常完美的解決方案。別急著下結(jié)論突那,任何事情都有好的一面和壞的一面挫酿,沒有任何方案是絕對完美的。異步方式的缺點(diǎn)愕难,就在于其非線性的執(zhí)行方式帶給編寫程序的困難早龟。從上面的例子可以看到,異步程序的執(zhí)行結(jié)果與傳統(tǒng)的程序有很大區(qū)別猫缭。這就說明了編寫異步程序比較困難葱弟,需要改變傳統(tǒng)的程序設(shè)計(jì)思想。別低估了這個困難饵骨,傳統(tǒng)的力量是遠(yuǎn)遠(yuǎn)超出人的想象的翘悉!

結(jié)語

傳統(tǒng)的編程方式在互聯(lián)網(wǎng)不斷擴(kuò)張之后遇到了不少挑戰(zhàn)。并發(fā)處理居触,可擴(kuò)展性和降低成本也越來越受到重視(可以參考LINKIN招聘數(shù)據(jù))妖混。異步I/O無疑是一種(但非唯一)有效的解決方式。

稍后我們在一起看看采用異步I/O方式的NODE到底是如何利用異步模型來處理大規(guī)模并發(fā)的轮洋。到底是什么神奇的力量能讓服務(wù)器數(shù)量從三十臺降到三臺制市?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弊予,隨后出現(xiàn)的幾起案子祥楣,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误褪,死亡現(xiàn)場離奇詭異责鳍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兽间,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門历葛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘀略,你說我怎么就攤上這事恤溶。” “怎么了帜羊?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵咒程,是天一觀的道長。 經(jīng)常有香客問我讼育,道長帐姻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任窥淆,我火速辦了婚禮卖宠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忧饭。我一直安慰自己扛伍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布词裤。 她就那樣靜靜地躺著刺洒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吼砂。 梳的紋絲不亂的頭發(fā)上逆航,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音渔肩,去河邊找鬼因俐。 笑死,一個胖子當(dāng)著我的面吹牛周偎,可吹牛的內(nèi)容都是我干的抹剩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼蓉坎,長吁一口氣:“原來是場噩夢啊……” “哼澳眷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛉艾,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤钳踊,失蹤者是張志新(化名)和其女友劉穎衷敌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓瞪,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缴罗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祭埂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞒爬。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沟堡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矢空,我是刑警寧澤航罗,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站屁药,受9級特大地震影響粥血,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酿箭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一复亏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缭嫡,春花似錦缔御、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至评架,卻和暖如春眷茁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纵诞。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工上祈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浙芙。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓登刺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茁裙。 傳聞我的和親對象是個殘疾皇子塘砸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容