gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

深入聊聊Node 異步和事件循環的底層實現和執行機制

深入聊聊Node 異步和事件循環的底層實現和執行機制

Node 最初是為打造高性能的 Web 服務器而生,作為 JavaScript 的服務端運行時,具有事件驅動、異步 I/O、單線程等特性?;谑录h的異步編程模型使 Node 具備處理高并發的能力,極大地提升服務器的性能,同時,由于保持了 JavaScript 單線程的特點,Node 不需要處理多線程下狀態同步、死鎖等問題,也沒有線程上下文切換所帶來的性能上的開銷。基于這些特性,使 Node 具備高性能、高并發的先天優勢,并可基于它構建各種高速、可伸縮網絡應用平臺。

本文將深入 Node 異步和事件循環的底層實現和執行機制,希望對你有所幫助。

為什么要異步?

Node 為什么要使用異步來作為核心編程模型呢?

前面說過,Node 最初是為打造高性能的 Web 服務器而生,假設業務場景中有幾組互不相關的任務要完成,現代主流的解決方式有以下兩種:

  • 單線程串行依次執行。

  • 多線程并行完成。

單線程串行依次執行,是一種同步的編程模型,它雖然比較符合程序員按順序思考的思維方式,易寫出更順手的代碼,但由于是同步執行 I/O,同一時刻只能處理單個請求,會導致服務器響應速度較慢,無法在高并發的應用場景下適用,且由于是阻塞 I/O,CPU 會一直等待 I/O 完成,無法做其他事情,使 CPU 的處理能力得不到充分利用,最終導致效率的低下,

而多線程的編程模型也會因為編程中的狀態同步、死鎖等問題讓開發人員頭疼。盡管多線程在多核 CPU 上能夠有效提升 CPU 的利用率。

雖然單線程串行依次執行和多線程并行完成的編程模型有其自身的優勢,但是在性能、開發難度等方面也有不足之處。

除此之外,從響應客戶端請求的速度出發,如果客戶端同時獲取兩個資源,同步方式的響應速度會是兩個資源的響應速度之和,而異步方式的響應速度會是兩者中最大的一個,性能優勢相比同步十分明顯。隨著應用復雜度的增加,該場景會演變成同時響應 n 個請求,異步相比于同步的優勢將會凸顯出來。

綜上所述,Node 給出了它的答案:利用單線程,遠離多線程死鎖、狀態同步等問題;利用異步 I/O,讓單線程遠離阻塞,以更好地使用 CPU。這就是 Node 使用異步作為核心編程模型的原因。

此外,為了彌補單線程無法利用多核 CPU 的缺點,Node 也提供了類似瀏覽器中 Web Workers 的子進程,該子進程可以通過工作進程高效地利用 CPU。

如何實現異步?

聊完了為什么要使用異步,那要如何實現異步呢?

我們通常所說的異步操作總共有兩類:一是像文件 I/O、網絡 I/O 這類與 I/O 有關的操作;二是像 setTimeOut、setInterval 這類與 I/O 無關的操作。很明顯我們所討論的異步是指與 I/O 有關的操作,即異步 I/O。

異步 I/O 的提出是期望 I/O 的調用不會阻塞后續程序的執行,將原有等待 I/O 完成的這段時間分配給其余需要的業務去執行。要達到這個目的,就需要用到非阻塞 I/O。

阻塞 I/O 是 CPU 在發起 I/O 調用后,會一直阻塞,等待 I/O 完成。知道了阻塞 I/O,非阻塞 I/O 就很好理解了,CPU 在發起 I/O 調用后會立即返回,而不是阻塞等待,在 I/O 完成之前,CPU 可以處理其他事務。顯然,相比于阻塞 I/O,非阻塞 I/O 多于性能的提升是很明顯的。

那么,既然使用了非阻塞 I/O,CPU 在發起 I/O 調用后可以立即返回,那它是如何知道 I/O 完成的呢?答案是輪詢。

為了及時獲取 I/O 調用的狀態,CPU 會不斷重復調用 I/O 操作來確認 I/O 是否已經完成,這種重復調用判斷操作是否完成的技術就叫做輪詢。

顯然,輪詢會讓 CPU 不斷重復地執行狀態判斷,是對 CPU 資源的浪費。并且,輪詢的間間隔很難控制,如果間隔太長,I/O 操作的完成得不到及時的響應,間接降低應用程序的響應速度;如果間隔太短,難免會讓 CPU 花在輪詢的耗時變長,降低 CPU 資源的利用率。

因此,輪詢雖然滿足了非阻塞 I/O 不會阻塞后續程序的執行的要求,但是對于應用程序而言,它仍然只能算是一種同步,因為應用程序仍然需要等待 I/O 完全返回,依舊花費了很多時間來等待。

我們所期望的完美的異步 I/O,應該是應用程序發起非阻塞調用,無須通過輪詢的方式不斷查詢 I/O 調用的狀態,而是可以直接處理下一個任務,在 I/O 完成后通過信號量或回調將數據傳遞給應用程序即可。

如何實現這種異步 I/O 呢?答案是線程池。

雖然本文一直提到,Node 是單線程執行的,但此處的單線程是指 JavaScript 代碼是執行在單線程上的,對于 I/O 操作這類與主業務邏輯無關的部分,通過運行在其他線程的方式實現,并不會影響或阻塞主線程的運行,反而可以提高主線程的執行效率,實現異步 I/O。

通過線程池,讓主線程僅進行 I/O 的調用,讓其他多個線程進行阻塞 I/O 或者非阻塞 I/O 加輪詢技術完成數據獲取,再通過線程之間的通信將 I/O 得到的數據進行傳遞,這就輕松實現了異步 I/O:

深入聊聊Node 異步和事件循環的底層實現和執行機制

主線程進行 I/O 調用,而線程池進行 I/O 操作,完成數據的獲取,然后通過線程之間的通信將數據傳遞給主線程,即可完成一次 I/O 的調用,主線程再利用回調函數,將數據暴露給用戶,用戶再利用這些數據來完成業務邏輯層面的操作,這就是 Node 中一次完整的異步 I/O 流程。而對于用戶來說,不必在意底層這些繁瑣的實現細節,只需要調用 Node 封裝好的異步 API,并傳入處理業務邏輯的回調函數即可,如下所示:

const fs = require("fs");  fs.readFile('example.js', (data) => {   // 進行業務邏輯的處理 });

Nodejs 的異步底層實現機制在不同平臺下有所不同:Windows 下主要通過 IOCP 來向系統內核發送 I/O 調用和從內核獲取已完成的 I/O 操作,配以事件循環,以此完成異步 I/O 的過程;Linux 下通過 epoll 實現這個過程;FreeBSD下通過 kqueue 實現,Solaris 下通過 Event ports 實現。線程池在 Windows 下由內核(IOCP)直接提供,*nix 系列則由 libuv 自行實現。

由于 Windows 平臺和 *nix 平臺的差異,Node 提供了 libuv 作為抽象封裝層,使得所有平臺兼容性的判斷都由這一層來完成,保證上層的 Node 與下層的自定義線程池及 IOCP 之間各自獨立。Node 在編譯期間會判斷平臺條件,選擇性編譯 unix 目錄或是 win 目錄下的源文件到目標程序中:

深入聊聊Node 異步和事件循環的底層實現和執行機制

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
色综合色综合色综合色综合| 午夜精品久久久内射近拍高清| 92看片淫黄大片一级| 国产乱子伦精品无码专区| 99久久99精品| 久久久福利影院| 中文字幕第三区| 日韩a一级欧美一级| 亚洲综合伊人久久| 警花观音坐莲激情销魂小说| 天堂av手机在线| 影音先锋男人的网站| 99精品一级欧美片免费播放| 国产精品中文久久久久久| 免费观看中文字幕| 九一国产精品视频| 欧美牲交a欧美牲交aⅴ免费真 | www.污污视频| 青春草在线视频免费观看| 国产免费一区二区三区四在线播放| 手机精品视频在线| 欧美性潮喷xxxxx免费视频看| 精品视频在线观看一区二区| www精品久久| 国产精品v日韩精品v在线观看| 天堂在线一区二区三区| av日韩在线看| 天堂中文视频在线| 午夜影院免费观看视频| 今天免费高清在线观看国语| www国产黄色| 久久精品国产99久久99久久久| 欧美一区二区视频在线播放| 日韩一级在线免费观看| ijzzijzzij亚洲大全| 成人一级片网站| 91麻豆天美传媒在线| 国产成人无码一二三区视频| 欧美国产日韩在线视频| 久久久噜噜噜www成人网| 不用播放器的免费av| 成人免费在线小视频| 97超碰人人看| 色播五月综合网| 免费在线观看的av网站| 奇米777在线| 91制片厂毛片| 男人天堂1024| 日韩中文字幕在线免费| 一级黄色片在线免费观看| 免费激情视频在线观看| 日韩a级黄色片| 三年中文高清在线观看第6集| 不要播放器的av网站| 日韩黄色短视频| www国产无套内射com| 天天干天天色天天干| 毛片一区二区三区四区| 欧美在线一区视频| 国产 欧美 日韩 一区| 亚洲高清视频免费| 一区二区久久精品| 亚洲天堂av一区二区| 簧片在线免费看| 污色网站在线观看| 欧美男女交配视频| 日韩在线不卡一区| 国产乱码一区二区三区四区| 国产理论在线播放| 少妇网站在线观看| 女人高潮一级片| 小说区视频区图片区| 亚洲高潮无码久久| 黄色一级大片免费| 人妻少妇精品久久| 免费午夜视频在线观看| 国产精品秘入口18禁麻豆免会员 | 黄色高清无遮挡| 国产精品人人妻人人爽人人牛| 日韩精品一区二区三区色欲av| 国产最新免费视频| 国产精品区在线| 女人床在线观看| 久久国产亚洲精品无码| 日韩无套无码精品| 不卡中文字幕在线| 福利视频免费在线观看| 亚洲午夜精品久久久久久人妖| 另类小说色综合| 影音先锋成人资源网站| 免费国产黄色网址| 亚洲视频一二三四| 国产av国片精品| 99sesese| 亚洲熟妇av日韩熟妇在线| youjizzxxxx18| 国产在线观看欧美| 国产高潮免费视频| 亚洲熟妇无码一区二区三区| 欧美一级片中文字幕| 国产在线拍揄自揄拍无码| 丰满爆乳一区二区三区| 欧美爱爱视频网站| 日本精品www| 日韩精品免费一区| 天天插天天操天天射| 欧美大片免费播放| 国模私拍视频在线观看| 国产成人永久免费视频| 在线观看国产福利| 91淫黄看大片| 少妇人妻在线视频| www.日本三级| 日韩精品视频网址| 亚洲天堂网一区| 精品99在线视频| 激情成人开心网| 91社在线播放| 黄色aaaaaa| www.se五月| 九九九在线观看视频| 可以在线看的黄色网址| 91精品国产91久久久久麻豆 主演| 中文字幕一区二区在线观看视频| 国产男女激情视频| 玩弄中年熟妇正在播放| 国产成人亚洲综合无码| 麻豆视频传媒入口| 三年中国中文在线观看免费播放| 亚洲36d大奶网| 五月天婷婷亚洲| 性chinese极品按摩| 天天天干夜夜夜操| 中文字幕网av| 看看黄色一级片| 激情在线观看视频| www.-级毛片线天内射视视| 波多野结衣xxxx| 亚洲女人在线观看| 草草草视频在线观看| 色爽爽爽爽爽爽爽爽| 日韩一区二区高清视频| 欧美深夜福利视频| 无码日韩人妻精品久久蜜桃| 日韩中文字幕免费在线| 九九精品久久久| 免费成人深夜夜行网站视频| 艳母动漫在线免费观看| 国产成人一区二区三区别| 大j8黑人w巨大888a片| 国产精品99久久免费黑人人妻| 午夜免费一区二区| 日韩av影视大全| 大陆av在线播放| 国产a级片免费观看| 国产高清av片| 欧美 丝袜 自拍 制服 另类| 九色porny91| 国内精品国产三级国产99| 丰满的少妇愉情hd高清果冻传媒| 男女av免费观看| 小说区视频区图片区| 黄色免费视频大全| 久久综合在线观看| 噜噜噜久久亚洲精品国产品麻豆 | 成人在线视频一区二区三区| 女人喷潮完整视频| 国产日本欧美在线| 成人三级视频在线播放| 在线免费黄色小视频| 男女猛烈激情xx00免费视频| 三年中国国语在线播放免费| 四虎4hu永久免费入口| 男女视频在线看| 无码人妻丰满熟妇区96| 少妇熟女一区二区| 奇米影音第四色| 国产精品333| 超碰10000| 亚洲一区日韩精品| 久久久久久香蕉| 欧美二区在线视频| 亚洲乱码日产精品bd在线观看| 亚洲娇小娇小娇小| 青青在线视频观看| 日日橹狠狠爱欧美超碰| www.激情网| 黄色网zhan| 日韩视频在线观看一区二区三区| 久章草在线视频| 无码人妻丰满熟妇区毛片| 日本xxxxxxxxxx75| 无码人妻精品一区二区蜜桃网站| 一级片免费在线观看视频| 污污动漫在线观看| 国产九九热视频| 中国黄色片一级| av中文字幕网址| 99九九精品视频| 亚洲国产精品影视|