Fs

疑問

最近在知乎上面看到一條有趣的關(guān)于node.js面試問題

Node 里有readFile和對(duì)應(yīng)的同步方法readFileSync术唬,但http.get() 卻沒有 http.getSync(),如果要實(shí)現(xiàn)一個(gè)http.getSync()溉浙,怎么做奈惑?

http://www.zhihu.com/question/24648388

圍繞這個(gè)問題來展開我們的思考矛缨,文件讀取是node.js最重要的io模塊拐叉,也是最特別的模塊毫深,他的特別在于它是唯一一個(gè)擁有異步和同步,readFile異步驾诈,readFileSync同步缠诅,兩種api的模塊,相信每一個(gè)nodejser 都會(huì)覺得是不是意味著乍迄,我們能在node.js里面寫出同步的處理函數(shù)管引?本文將會(huì)圍繞這個(gè)核心問題來展開分析。

API

fs.readFile 異步讀取

js基本流程

通過fs.stats 讀取文件大小闯两,當(dāng)文件大小等于0的時(shí)候褥伴,可能是內(nèi)核函數(shù)無法正確讀取文件大小,對(duì)于這種情況漾狼,node.js 會(huì)進(jìn)行分片讀取重慢,每次異步讀取8k內(nèi)容到buffer里,并將buffer的內(nèi)容存儲(chǔ)到數(shù)組逊躁,直到文件無法讀取為止似踱,同時(shí)會(huì)在無法讀取的時(shí)候,將剛才8k們的數(shù)組稽煤,合并為一個(gè)buffer返回結(jié)果核芽,對(duì)于能夠正確讀取文件大小的時(shí)候,則直接生成與文件大小相同酵熙,并將內(nèi)容讀取到buffer里面轧简,當(dāng)size大于4g的時(shí)候,直接報(bào)錯(cuò)返回匾二。

fs.readFileSync 同步讀取

主要流程與異步相同哮独,唯一不同的地方,是readFileSync 不帶回調(diào)參數(shù)察藐,具體結(jié)果是直接返回借嗽。

底層實(shí)現(xiàn)

由此可見,究竟執(zhí)行的方式是異步還是同步转培,問題的核心在與底層實(shí)現(xiàn)恶导,讓我們看看libuv是怎么說的。

截取libuv的原話浸须,是怎么說的

The libuv filesystem operations are different from socket operations. Socket operations use the non-blocking operations provided by the operating system. Filesystem operations use blocking functions internally, but invoke these functions in a thread pool and notify watchers registered with the event loop when application interaction is required.

libuv的文件操作方法跟socket的實(shí)現(xiàn)方式原理不一樣惨寿,對(duì)于socket的處理,libuv是調(diào)用系統(tǒng)本身的非阻塞特性删窒, 而fs模塊裂垦,則是調(diào)用通過線程池來模擬,監(jiān)聽線程池的任務(wù)肌索,當(dāng)任務(wù)完成后蕉拢,回調(diào)信息給調(diào)用者。

而最終libuv采用異步,還是同步的方式的途徑晕换,是根據(jù) 調(diào)用的參數(shù)決定的

UV_EXTERN int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, uv_file file, void* buf, size_t length, int64_t offset, uv_fs_cb cb);

當(dāng)callback為空的時(shí)候午乓,函數(shù)同步執(zhí)行,當(dāng)過callback存在函數(shù)的時(shí)候闸准,異步執(zhí)行益愈。

總結(jié)

getSync 這種方法,在libuv框架下是無法實(shí)現(xiàn)的夷家,libuv從底層調(diào)用開始就是非阻塞的蒸其,是操作系統(tǒng)提供,所以你無論用什么黑魔法實(shí)際效果都是異步库快,但對(duì)于fs模塊來說摸袁,僅僅是利用線程池模擬出異步的效果,所以能义屏,非系統(tǒng)自帶的特性但惶,所以能寫出同步的api。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末湿蛔,一起剝皮案震驚了整個(gè)濱河市膀曾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阳啥,老刑警劉巖添谊,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異察迟,居然都是意外死亡斩狱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門扎瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來所踊,“玉大人,你說我怎么就攤上這事概荷★醯海” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵误证,是天一觀的道長继薛。 經(jīng)常有香客問我,道長愈捅,這世上最難降的妖魔是什么遏考? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蓝谨,結(jié)果婚禮上灌具,老公的妹妹穿的比我還像新娘青团。我一直安慰自己,他們只是感情好咖楣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布督笆。 她就那樣靜靜地躺著,像睡著了一般截歉。 火紅的嫁衣襯著肌膚如雪胖腾。 梳的紋絲不亂的頭發(fā)上烟零,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天瘪松,我揣著相機(jī)與錄音,去河邊找鬼锨阿。 笑死宵睦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墅诡。 我是一名探鬼主播壳嚎,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼末早!你這毒婦竟也來了烟馅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤然磷,失蹤者是張志新(化名)和其女友劉穎郑趁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姿搜,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寡润,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舅柜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梭纹。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖致份,靈堂內(nèi)的尸體忽然破棺而出变抽,到底是詐尸還是另有隱情,我是刑警寧澤氮块,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布瞬沦,位于F島的核電站,受9級(jí)特大地震影響雇锡,放射性物質(zhì)發(fā)生泄漏逛钻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一锰提、第九天 我趴在偏房一處隱蔽的房頂上張望曙痘。 院中可真熱鬧芳悲,春花似錦、人聲如沸边坤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茧痒。三九已至肮韧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旺订,已是汗流浹背弄企。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留区拳,地道東北人拘领。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像樱调,于是被迫代替她去往敵國和親约素。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • //公共引用 varfs =require('fs'), path =require('path'); 1笆凌、讀取文...
    才気莮孒閱讀 834評(píng)論 0 1
  • 書上細(xì)節(jié)回顧 之前在看《一本全面的Node.js教程》在書中最后的部分圣猎,作者實(shí)現(xiàn)了圖片上傳并在另外一個(gè)頁面中顯示的...
    Cer_ml閱讀 1,062評(píng)論 5 10
  • 實(shí)驗(yàn)簡介 fs模塊用于對(duì)系統(tǒng)文件及目錄進(jìn)行讀寫操作參考鏈接:http://nodejs.org/api/fs.ht...
    張金宇閱讀 607評(píng)論 0 0
  • 我的中學(xué)是在鎮(zhèn)上的二中讀完的。那是一所真正的鄉(xiāng)鎮(zhèn)中學(xué)乞而,學(xué)校里一色磚瓦結(jié)構(gòu)的平房送悔,連一棟二層以上的小樓都沒有...
    老陌001閱讀 2,120評(píng)論 32 30
  • 看見一個(gè)穿著黑色T-shirt 牛仔褲 白色板鞋的男生,他手里轉(zhuǎn)動(dòng)著魔方晦闰,已經(jīng)拼出白色紅色的兩面了放祟。
    小犇粉閱讀 89評(píng)論 0 0