溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

node是不是單線程運(yùn)行

發(fā)布時(shí)間:2022-06-16 10:08:47 來源:億速云 閱讀:122 作者:zzz 欄目:web開發(fā)

這篇“node是不是單線程運(yùn)行”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“node是不是單線程運(yùn)行”文章吧。

node是單線程運(yùn)行的,采用單線程異步非阻塞模式;但是嚴(yán)格來說node中存在著多種線程,單線程是指node中只有一個(gè)js引擎在主線程上運(yùn)行,其他的異步操作也是有獨(dú)立的線程去執(zhí)行,同時(shí)node默認(rèn)是單線程,一個(gè)“node.js”無法利用多核資源。

本教程操作環(huán)境:windows10系統(tǒng)、nodejs 12.19.0版本、Dell G3電腦。

node都是單線程運(yùn)行的嗎

node是單線程運(yùn)行的,采用單線程異步非阻塞模式。

提到node,我們就可以立刻想到單線程、異步IO、事件驅(qū)動等字眼。首先要明確的是node真的是單線程的嗎,如果是單線程的,那么異步IO,以及定時(shí)事件(setTimeout、setInterval等)又是在哪里被執(zhí)行的。

其實(shí),按照嚴(yán)格來說,node并不是單線程的。node中存在著多種線程,包括:

js引擎執(zhí)行的線程

定時(shí)器線程(setTimeout, setInterval)

異步http線程(ajax)

我們平時(shí)所說的單線程是指node中只有一個(gè)js引擎在主線程上運(yùn)行。其他異步IO和事件驅(qū)動相關(guān)的線程通過libuv來實(shí)現(xiàn)內(nèi)部的線程池和線程調(diào)度。libv中存在了一個(gè)Event Loop,通過Event Loop來切換實(shí)現(xiàn)類似于多線程的效果。簡單的來講Event Loop就是維持一個(gè)執(zhí)行棧和一個(gè)事件隊(duì)列,當(dāng)前執(zhí)行棧中的如果發(fā)現(xiàn)異步IO以及定時(shí)器等函數(shù),就會把這些異步回調(diào)函數(shù)放入到事件隊(duì)列中。當(dāng)前執(zhí)行棧執(zhí)行完成后,從事件隊(duì)列中,按照一定的順序執(zhí)行事件隊(duì)列中的異步回調(diào)函數(shù)。

node是不是單線程運(yùn)行

上圖中從執(zhí)行棧,到事件隊(duì)列,最后事件隊(duì)列中按照一定的順序執(zhí)行回調(diào)函數(shù),整個(gè)過程就是一個(gè)簡化版的Event Loop。此外回調(diào)函數(shù)執(zhí)行時(shí),同樣會生成一個(gè)執(zhí)行棧,在回調(diào)函數(shù)里面還有可能嵌套異步的函數(shù),也就是說執(zhí)行棧存在著嵌套。

也就是說node中的單線程是指js引擎只在唯一的主線程上運(yùn)行,其他的異步操作,也是有獨(dú)立的線程去執(zhí)行,通過libv的Event Loop實(shí)現(xiàn)了類似于多線程的上下文切換以及線程池調(diào)度。線程是最小的進(jìn)程,因此node也是單進(jìn)程的。這樣就解釋了為什么node是單線程和單進(jìn)程的。

以上就是關(guān)于“node是不是單線程運(yùn)行”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI