javascript - node中的事件輪詢和異步代碼的執(zhí)行
問題描述
node的主線程執(zhí)行js代碼,當是一個異步操作時,node會交給libuv去執(zhí)行,然后會去執(zhí)行異步后面的代碼。當libuv執(zhí)行完后,會放入一個循環(huán)隊列中,libuv會有一個類似while(true)的事件循環(huán)(Event Loop),這個事件循環(huán)存在于node的單線程(也就是主線程),主線程循環(huán)取事件執(zhí)行回調(diào)函數(shù)。那么主線程的循環(huán)取事件和執(zhí)行異步后面的代碼是怎樣的一個過程?一個線程不可能同時做兩件事,是執(zhí)行完異步后面的代碼,cpu空閑時才會去循環(huán)取事件嗎?
問題解答
回答1:首先明確一點,主線程在有代碼執(zhí)行時是不會去輪詢的。所以主線程會把所有的初始代碼(非回調(diào)代碼)執(zhí)行完后再去事件隊列輪詢(事件隊列在被輪詢時可以看成一個js對象)因為理論上js引擎主線程,只能識別js代碼。但初始代碼執(zhí)行完后,js主線程會去輪詢?nèi)∈录斎〉揭粋€回調(diào)函數(shù)后,js引擎會把當前回調(diào)代碼執(zhí)行完后,才會在去輪詢。總結(jié)一下就是,只有js引擎在沒有代碼執(zhí)行時,才會去進行輪詢,或者說,js主線程中永遠只有一個回調(diào)函數(shù)
回答2:
覺得這篇文章能解決你的疑惑
相關(guān)文章:
1. docker-compose 為何找不到配置文件?2. vim - docker中新的ubuntu12.04鏡像,運行vi提示,找不到命名.3. 為什么我ping不通我的docker容器呢???4. mac連接阿里云docker集群,已經(jīng)卡了2天了,求問?5. debian - docker依賴的aufs-tools源碼哪里可以找到啊?6. docker網(wǎng)絡(luò)端口映射,沒有方便點的操作方法么?7. golang - 用IDE看docker源碼時的小問題8. docker - 如何修改運行中容器的配置9. 關(guān)于docker下的nginx壓力測試10. docker-machine添加一個已有的docker主機問題

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