node的主執行緒執行js程式碼,當是一個非同步操作時,node會交給libuv去執行,然後會去執行非同步後面的程式碼。當libuv執行完後,會放入一個循環佇列中,libuv會有一個類似while(true)的事件循環(Event Loop),這個事件循環存在於node的單執行緒(也就是主執行緒),主執行緒循環取事件執行回呼函數。
那麼主執行緒的迴圈取事件和執行非同步後面的程式碼是怎樣的一個過程?一個執行緒不可能同時做兩件事,是執行完非同步後面的程式碼,cpu空閒時才會去循環取事件嗎?
过去多啦不再A梦2017-07-05 10:41:22
先明確一點,主執行緒在有程式碼執行時是不會去輪詢的。
所以主線程會把所有的初始代碼(非回調代碼)執行完後再去事件隊列輪詢(事件隊列在被輪詢時可以看成一個js對象)因為理論上js引擎主線程,只能識別js程式碼。
但初始程式碼執行完後,js主執行緒會去輪詢取事件,當取到一個回呼函數後,js引擎會把目前回呼程式碼執行完後,才會
在去輪詢。
總結一下就是,只有js引擎在沒有程式碼執行時,才會去進行輪詢,或者說,js主執行緒永遠只有一個回呼函數