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. 關(guān)于docker下的nginx壓力測(cè)試2. docker - 各位電腦上有多少個(gè)容器啊?容器一多,自己都搞混了,咋辦呢?3. mac里的docker如何命令行開(kāi)啟呢?4. 關(guān)docker hub上有些鏡像的tag被標(biāo)記““This image has vulnerabilities””5. nignx - docker內(nèi)nginx 80端口被占用6. docker容器呢SSH為什么連不通呢?7. dockerfile - 我用docker build的時(shí)候出現(xiàn)下邊問(wèn)題 麻煩幫我看一下8. docker-compose 為何找不到配置文件?9. docker start -a dockername 老是卡住,什么情況?10. angular.js使用$resource服務(wù)把數(shù)據(jù)存入mongodb的問(wèn)題。

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