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