javascript - node中的事件輪詢和異步代碼的執(zhí)行
問(wèn)題描述
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è)過(guò)程?一個(gè)線程不可能同時(shí)做兩件事,是執(zhí)行完異步后面的代碼,cpu空閑時(shí)才會(huì)去循環(huán)取事件嗎?
問(wèn)題解答
回答1:首先明確一點(diǎn),主線程在有代碼執(zhí)行時(shí)是不會(huì)去輪詢的。所以主線程會(huì)把所有的初始代碼(非回調(diào)代碼)執(zhí)行完后再去事件隊(duì)列輪詢(事件隊(duì)列在被輪詢時(shí)可以看成一個(gè)js對(duì)象)因?yàn)槔碚撋蟡s引擎主線程,只能識(shí)別js代碼。但初始代碼執(zhí)行完后,js主線程會(huì)去輪詢?nèi)∈录?dāng)取到一個(gè)回調(diào)函數(shù)后,js引擎會(huì)把當(dāng)前回調(diào)代碼執(zhí)行完后,才會(huì)在去輪詢。總結(jié)一下就是,只有js引擎在沒(méi)有代碼執(zhí)行時(shí),才會(huì)去進(jìn)行輪詢,或者說(shuō),js主線程中永遠(yuǎn)只有一個(gè)回調(diào)函數(shù)
回答2:
覺(jué)得這篇文章能解決你的疑惑
相關(guān)文章:
1. boot2docker無(wú)法啟動(dòng)2. 關(guān)docker hub上有些鏡像的tag被標(biāo)記““This image has vulnerabilities””3. docker-compose中volumes的問(wèn)題4. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.5. java - SSH框架中寫分頁(yè)時(shí)service層中不能注入分頁(yè)類6. nignx - docker內(nèi)nginx 80端口被占用7. docker images顯示的鏡像過(guò)多,狗眼被亮瞎了,怎么辦?8. dockerfile - 為什么docker容器啟動(dòng)不了?9. docker容器呢SSH為什么連不通呢?10. 關(guān)于docker下的nginx壓力測(cè)試

網(wǎng)公網(wǎng)安備