javascript - node中的事件輪詢和異步代碼的執(zhí)行
問題描述
node的主線程執(zhí)行js代碼,當(dāng)是一個異步操作時,node會交給libuv去執(zhí)行,然后會去執(zhí)行異步后面的代碼。當(dāng)libuv執(zhí)行完后,會放入一個循環(huán)隊(duì)列中,libuv會有一個類似while(true)的事件循環(huán)(Event Loop),這個事件循環(huán)存在于node的單線程(也就是主線程),主線程循環(huán)取事件執(zhí)行回調(diào)函數(shù)。那么主線程的循環(huán)取事件和執(zhí)行異步后面的代碼是怎樣的一個過程?一個線程不可能同時做兩件事,是執(zhí)行完異步后面的代碼,cpu空閑時才會去循環(huán)取事件嗎?
問題解答
回答1:首先明確一點(diǎn),主線程在有代碼執(zhí)行時是不會去輪詢的。所以主線程會把所有的初始代碼(非回調(diào)代碼)執(zhí)行完后再去事件隊(duì)列輪詢(事件隊(duì)列在被輪詢時可以看成一個js對象)因?yàn)槔碚撋蟡s引擎主線程,只能識別js代碼。但初始代碼執(zhí)行完后,js主線程會去輪詢?nèi)∈录?dāng)取到一個回調(diào)函數(shù)后,js引擎會把當(dāng)前回調(diào)代碼執(zhí)行完后,才會在去輪詢。總結(jié)一下就是,只有js引擎在沒有代碼執(zhí)行時,才會去進(jìn)行輪詢,或者說,js主線程中永遠(yuǎn)只有一個回調(diào)函數(shù)
回答2:覺得這篇文章能解決你的疑惑
相關(guān)文章:
1. objective-c - iOS怎么實(shí)現(xiàn)像QQ或者微信的實(shí)時推送2. 網(wǎng)頁爬蟲 - python爬蟲翻頁問題,請問各位大神我這段代碼怎樣翻頁,還有價格要登陸后才能看到,應(yīng)該怎么解決3. 求大神幫我看看是哪里寫錯了 感謝細(xì)心解答4. MySQL客戶端吃掉了SQL注解?5. 數(shù)據(jù)庫 - MySQL 單表500W+數(shù)據(jù),查詢超時,如何優(yōu)化呢?6. php自學(xué)從哪里開始?7. mysql - AttributeError: ’module’ object has no attribute ’MatchType’8. android - Windows系統(tǒng)下運(yùn)行react-native App時,報下面的錯誤?9. phpstady在win10上運(yùn)行10. javascript - 圖片能在網(wǎng)站顯示,但控制臺仍舊報錯403 (Forbidden)
