nodejsjavascript
non-blocking是指node.js進程中不一樣步等待執行非javascript操做
(例如I/O)完成而繼續執行下一塊代碼的特性。java
注:CPU密集型屬於javascript操做。node
I/O一般指與磁盤
與網絡
的交互linux
非阻塞I/O模型使得nodejs支持高併發且很是適合於I/O密集型應用c++
共6個階段git
timers
setTimeout與setInterval回調函數隊列pending callbacks
會在下一次loop中執行的系統級回調隊列。如TCP ECONNREFUSED -idle,prepare
內部使用poll
接收新的I/O事件。執行I/O相關回調。在這個階段node進程可能會阻塞check
setImmediate回調會在這個階段執行close
一些關閉的回調。好比connect.on('close', () => {....})
注:process.nextTick不屬於任何一個階段,它是介於任意兩個階段之間,而且在階段切換時執行nextTick回調github
注:所以nodejs並非純粹的單線程語言!正則表達式
同步
執行常規的變量、方法的定義與調用,javascript全部回調以及非阻塞異步I/O如網絡I/O異步
執行「昂貴」繁重的任務。node提供非阻塞I/O(操做系統不提供)API,以及CPU密集的I/O API
抽象來講,Event Loop維護掛起事件的隊列,Worker Pool維護掛起任務的隊列。npm
實際上,Event Loop並非維護一個隊列。而是一個文件描述符的集合
,這些文件描述符從系統級事件通知機制獲取好比epoll(linux),kqueue(OSX),IOCP(Windows)。這些文件描述符對應於某些網絡套接字以及node正在監視的文件等等。當某個描述符準備好時,Event Loop會將其轉換爲合適的事件並執行對應的回調。數組
另外,Worker Pool維護的是一個真正的隊列。Worker會pop出隊列的task並執行,完成後會觸發Event Loop「至少一個事件已完成」的事件。
nodejs默認的Worker Pool專門用於處理I/O任務,維護本身的線程池可使用cluster模塊以及child_process模塊作自定義線程池。
Node服務器的吞吐量取決於
WorkerPool的吞吐量。有效下降逐個任務時間開銷
以及穩定任務時間開銷的變化
將最大程度提高服務器的吞吐量。最多見的方法就是複雜重複型任務(好比數組迭代)作分區處理。
注:因爲調度Worker Pool會增長額外的通訊開銷,由於Worker Pool沒法獲取主線程的命名空間從而沒法直接讀取Javascript對象,因此須要序列化/反序列化致使增長通訊成本。
npm生態系統中存在數十萬個模塊爲開發者提供了極大的便利,然而社區中npm包參差不齊,由於沒法較爲準確的估計其使用Event Loop或者Worker Pool的成本而致使一些程序隱患。