有一天老大忽然問起我這個問題,nodejs運行機制 是怎樣的?因自己對nodejs也不是很熟悉,就上網查了一下,得出結果如下;
1.簡介
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。將libuv作為跨平台抽象層,libuv是用c/c++寫成的高性能事件驅動的程序庫。nodejs的原理類似c/c++系統編程中的epoll
(1)V8引擎解析JavaScript腳本。
(2)解析后的代碼,調用Node API。
(3)libuv庫負責Node API的執行。它將不同的任務分配給不同的線程,形成一個Event Loop(事件循環),以異步的方式將任務的執行結果返回給V8引擎。
(4)V8引擎再將結果返回給用戶。
3.事件循環(Event Loop)
nodejs 執行之后會初始化一個事件循環,執行代碼程序(這些程序可能會造成異步調用、定時器或者process.nextTick()),然后開始執行事件循環。
事件循環的執行循序:
每一個模塊都是事件循環的一個階段,每個階段都有一個要執行的回調的FIFO隊列。雖然每個階段都不同,一般來說,當事件執行到一個階段,先執行這個階段特有的操作,然后操作這個階段的隊列,當隊列執行完或者達到了回調上限,事件循環就會執行下一個階段。
各個階段介紹
timers:
執行 setTimeout() 和 setInterval().的回調
setImmediate() 的回調在這里執行 當程序執行之后,一般情況下,事件循環會在poll階段等待連接請求,但是,如果代碼中有setImmediate()的回調函數,並且poll階段空閑,事件循環就會繼續執行check階段,而不會繼續在poll階段等在poll事件
close callbacks: