摘要:給出了解決方案就是單線程,遠(yuǎn)離線程鎖,狀態(tài)同步的問題,使用異步讓單線程遠(yuǎn)離阻塞,高效利用。而實際上的異步是采用了線程池技術(shù),發(fā)起異步時,把操作扔到線程池里面執(zhí)行,然后主線程繼續(xù)執(zhí)行其他操作,執(zhí)行完畢通過線程間通信通知主線程,主線程執(zhí)行回調(diào)。
異步IO,事件驅(qū)動,單線程構(gòu)成了node的基調(diào),為什么異步IO在node中如此重要呢?
我們先來說一下異步的概念,異步常見于前端開發(fā),例如ajax異步請求資源,如果前端頁面同步請求資源,那麼當(dāng)我們請求一個資源的時候,會阻塞代碼往下執(zhí)行,直到這個IO請求結(jié)束,那樣用戶就會發(fā)現(xiàn)頁面卡死,點擊事件等等失效,無疑這會使用戶流失。
同樣在運行服務(wù)端代碼的時候,如果我們的程序是同步的,那麼面對來自客戶端的請求,會逐個做出響應(yīng),從而使后面的請求等待時間很久,在這種場景可以使用多線程并行執(zhí)行,但是多線程編程的缺點是,創(chuàng)建線程,切換線程上下文開銷大并且面臨狀態(tài)鎖,狀態(tài)同步等問題。使用異步進行IO操作,避免了主線程的阻塞高效利用cpu。
node給出了解決方案就是單線程,遠(yuǎn)離線程鎖,狀態(tài)同步的問題,使用異步IO讓單線程遠(yuǎn)離阻塞,高效利用cpu。
異步IO與非阻塞IO經(jīng)常放在一起說,實際上他們是兩個不同的概念,上面說的是異步IO,那麼什么是阻塞IO,和非阻塞IO呢?
阻塞的IO操作就是發(fā)起IO操作后,線程阻塞等待IO完成,這期間cpu得不到有效利用。
非阻塞IO操作其實就是發(fā)起IO操作后,通過事件輪巡,或者事件通知機制,不斷查詢IO操作是否完成,或者是主線程進入休眠等待事件通知IO結(jié)束,然后繼續(xù)向下執(zhí)行代碼,實際上非阻塞IO期間,cpu要不用來查詢要不用來休眠,也沒有得到有效利用。
而實際上node的異步IO是采用了線程池技術(shù),發(fā)起異步IO時,把io操作扔到線程池里面執(zhí)行,然后主線程繼續(xù)執(zhí)行其他操作,io執(zhí)行完畢通過線程間通信通知主線程,主線程執(zhí)行回調(diào)。
另外nix平臺和windows平臺下實現(xiàn)異步io的方案并不相同,nix下node使用自己實現(xiàn)的線程池模擬異步io,windows下使用IOCP實現(xiàn)異步io,由于平臺的差異性,node封裝了libuv層來兼容不同平臺。
node異步IO模型
異步調(diào)用
發(fā)起一個異步調(diào)用
封裝請求對象,再請求對象上添加回調(diào)函數(shù)
把請求對象放入線程池等待執(zhí)行
線程池
線程可用時執(zhí)行IO操作,把結(jié)果添加到請求對象上
通知iocp IO完成,歸還線程
事件循環(huán)
創(chuàng)建循環(huán),Tick獲取完成的IO交給IO觀察者
從IO觀察者獲取可用的對象
用對象的回調(diào)方法把對象上的結(jié)果作為參數(shù)執(zhí)行回調(diào)
循環(huán)從IO觀察者獲取可用對象,和獲取完成的IO加入IO觀察者,沒有可用對象時退出循環(huán)
請求對象,觀察者,事件循環(huán),線程池構(gòu)成了node的異步IO模型
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82164.html
摘要:原文地址一個非常適合入門學(xué)習(xí)的博客項目前端掘金一個非常適合入門學(xué)習(xí)的項目,代碼清晰結(jié)構(gòu)合理新聞前端掘金介紹一個由編寫的新聞。深入淺出讀書筆記知乎專欄前端專欄前端掘金去年的一篇老文章,恰好今天專欄開通,遷移過來。 破解前端面試(80% 應(yīng)聘者不及格系列):從閉包說起 - 掘金修訂說明:發(fā)布《80% 應(yīng)聘者都不及格的 JS 面試題》之后,全網(wǎng)閱讀量超過 6W,在知乎、掘金、cnodejs ...
摘要:原文地址一個非常適合入門學(xué)習(xí)的博客項目前端掘金一個非常適合入門學(xué)習(xí)的項目,代碼清晰結(jié)構(gòu)合理新聞前端掘金介紹一個由編寫的新聞。深入淺出讀書筆記知乎專欄前端專欄前端掘金去年的一篇老文章,恰好今天專欄開通,遷移過來。 破解前端面試(80% 應(yīng)聘者不及格系列):從閉包說起 - 掘金修訂說明:發(fā)布《80% 應(yīng)聘者都不及格的 JS 面試題》之后,全網(wǎng)閱讀量超過 6W,在知乎、掘金、cnodejs ...
摘要:發(fā)布一直是數(shù)據(jù)可視化的不錯選擇。本次發(fā)布的版本的更新包括使用代替回調(diào)函數(shù),等高線圖和密度圖。詳情發(fā)布該版本更新包括模塊調(diào)整,模塊新增函數(shù)判斷終端是否支持顏色,棄用函數(shù)和等。 01. D3.js 5.0 發(fā)布 D3 一直是 JavaScript 數(shù)據(jù)可視化的不錯選擇。本次發(fā)布的 5.0 版本的更新包括:使用 Promise 代替回調(diào)函數(shù),等高線圖和密度圖。 詳情:https://gith...
摘要:發(fā)布一直是數(shù)據(jù)可視化的不錯選擇。本次發(fā)布的版本的更新包括使用代替回調(diào)函數(shù),等高線圖和密度圖。詳情發(fā)布該版本更新包括模塊調(diào)整,模塊新增函數(shù)判斷終端是否支持顏色,棄用函數(shù)和等。 01. D3.js 5.0 發(fā)布 D3 一直是 JavaScript 數(shù)據(jù)可視化的不錯選擇。本次發(fā)布的 5.0 版本的更新包括:使用 Promise 代替回調(diào)函數(shù),等高線圖和密度圖。 詳情:https://gith...
閱讀 2548·2023-04-25 17:27
閱讀 1857·2019-08-30 15:54
閱讀 2402·2019-08-30 13:06
閱讀 3008·2019-08-30 11:04
閱讀 783·2019-08-29 15:30
閱讀 756·2019-08-29 15:16
閱讀 1766·2019-08-26 10:10
閱讀 3631·2019-08-23 17:02