十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要介紹“node.js是不是單線程”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“node.js是不是單線程”文章能幫助大家解決問題。
站在用戶的角度思考問題,與客戶深入溝通,找到多倫網(wǎng)站設計與多倫網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋多倫地區(qū)。
node.js默認是單線程的,因為JavaScript引擎的關系,node.js采用的是單線程異步非阻塞的模式,一個nodejs無法利用多核資源;但是可以有第三方庫提供多線程的支持,只是主線程是單線程,主線程中的操作是同步阻塞的。
本教程操作環(huán)境:windows10系統(tǒng)、nodejs 12.19.0版本、Dell G3電腦。
node.js默認是單線程,node.js采用單線程異步非阻塞模式。
node.js采用單線程異步非阻塞模式。它的單線程指的是自身Javascript運行環(huán)境的單線程,Node.js并沒有給Javascript執(zhí)行時創(chuàng)建新線程的能力,通過Libuv以及它的事件循環(huán)來實現(xiàn)異步。
Node 只是主線程是單線程,主線程中的操作是同步阻塞的。但它把所有需要異步的操作扔給了IO線程池,主線程通過一定的事件輪詢機制與IO線程池交互得到異步數(shù)據(jù)。
node.js的性能不是最高的,因為javascript引擎的關系,node.js默認是單線程,一個node.js應用無法利用多核資源。
不過有第三方庫提供多線程支持,但不是無縫的。node.js是解決I/O瓶頸的(相對于傳統(tǒng)技術,同步阻塞調用浪費線程),它并沒有提高I/O速度,只是資源調度更高效。如果I/O速度不解決,node.js只能說能同時處理好多request,但每個request的響應時間還是那么長,甚至更長。
Node 是單線程,那它是如何處理高并發(fā)請求的?
依靠事件驅動。

每個Node.js進程只有一個主線程在執(zhí)行程序代碼,形成一個執(zhí)行棧(execution context stack)。
主線程之外,還維護了一個"事件隊列"(Event queue)。當用戶的網(wǎng)絡請求或者其它的異步操作到來時,node都會把它放到Event Queue之中,此時并不會立即執(zhí)行它,代碼也不會被阻塞,繼續(xù)往下走,直到主線程代碼執(zhí)行完畢。
主線程代碼執(zhí)行完畢完成后,然后通過Event Loop,也就是事件循環(huán)機制,開始到Event Queue的開頭取出第一個事件,從線程池中分配一個線程去執(zhí)行這個事件,接下來繼續(xù)取出第二個事件,再從線程池中分配一個線程去執(zhí)行,然后第三個,第四個。主線程不斷的檢查事件隊列中是否有未執(zhí)行的事件,直到事件隊列中所有事件都執(zhí)行完了,此后每當有新的事件加入到事件隊列中,都會通知主線程按順序取出交EventLoop處理。當有事件執(zhí)行完畢后,會通知主線程,主線程執(zhí)行回調,線程歸還給線程池。
主線程不斷重復上面的第三步。
NodeJs 單線程只是一個主線程,本質上的異步操作還是由線程池完成的,node將所有的阻塞操作都交給了內部的線程池去實現(xiàn),本身只負責不斷的往返調度,并沒有進行真正的I/O操作,從而實現(xiàn)異步非阻塞I/O,這便是node單線程和事件驅動的精髓之處了。
關于“node.js是不是單線程”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。