javascript - node中的事件輪詢和異步代碼的執(zhí)行
問題描述
node的主線程執(zhí)行js代碼,當(dāng)是一個(gè)異步操作時(shí),node會(huì)交給libuv去執(zhí)行,然后會(huì)去執(zhí)行異步后面的代碼。當(dāng)libuv執(zhí)行完后,會(huì)放入一個(gè)循環(huán)隊(duì)列中,libuv會(huì)有一個(gè)類似while(true)的事件循環(huán)(Event Loop),這個(gè)事件循環(huán)存在于node的單線程(也就是主線程),主線程循環(huán)取事件執(zhí)行回調(diào)函數(shù)。那么主線程的循環(huán)取事件和執(zhí)行異步后面的代碼是怎樣的一個(gè)過程?一個(gè)線程不可能同時(shí)做兩件事,是執(zhí)行完異步后面的代碼,cpu空閑時(shí)才會(huì)去循環(huán)取事件嗎?
問題解答
回答1:首先明確一點(diǎn),主線程在有代碼執(zhí)行時(shí)是不會(huì)去輪詢的。所以主線程會(huì)把所有的初始代碼(非回調(diào)代碼)執(zhí)行完后再去事件隊(duì)列輪詢(事件隊(duì)列在被輪詢時(shí)可以看成一個(gè)js對象)因?yàn)槔碚撋蟡s引擎主線程,只能識(shí)別js代碼。但初始代碼執(zhí)行完后,js主線程會(huì)去輪詢?nèi)∈录?,?dāng)取到一個(gè)回調(diào)函數(shù)后,js引擎會(huì)把當(dāng)前回調(diào)代碼執(zhí)行完后,才會(huì)在去輪詢??偨Y(jié)一下就是,只有js引擎在沒有代碼執(zhí)行時(shí),才會(huì)去進(jìn)行輪詢,或者說,js主線程中永遠(yuǎn)只有一個(gè)回調(diào)函數(shù)
回答2:覺得這篇文章能解決你的疑惑
相關(guān)文章:
1. mysql - sql 左連接結(jié)果union右連接結(jié)果,導(dǎo)致重復(fù)性計(jì)算怎么解決?2. javascript - 滾動(dòng)到指定高度 開始輪流放動(dòng)畫,QQPC官網(wǎng)就是這么做的,請問使用什么開源庫方便點(diǎn)?3. mysql 遠(yuǎn)程連接出錯(cuò)10060,我已經(jīng)設(shè)置了任意主機(jī)了。。。4. 默認(rèn)輸出類型為json,如何輸出html5. 數(shù)組排序,并把排序后的值存入到新數(shù)組中6. php多任務(wù)倒計(jì)時(shí)求助7. mysql怎么表示兩個(gè)字段的差8. 怎么能做出標(biāo)簽切換頁的效果,(文字內(nèi)容隨動(dòng))9. PHP訂單派單系統(tǒng)10. MySQL的聯(lián)合查詢[union]有什么實(shí)際的用處
