Node.js 是單進程單線程應用程序,可是由於 V8 引擎提供的異步執行回調接口,經過這些接口能夠處理大量的併發,因此性能很是高。html
事件循環能讓 Node.js 執行非阻塞 I/O 操做,儘管JavaScript事實上是單線程的,事件循環經過在可能的狀況下將相應操做分擔給系統內核來實現。node
由於目前主流的內核都是多線程的,內核能夠處理後臺執行的多個操做。當其中一個操做完成的時候,內核告訴 Node.js,與其相應的回調就被添加到輪詢隊列(poll queue)中,並最終獲得執行。web
Node.js 開始的時候會初始化事件循環,處理目標腳本,腳本可能會進行異步API調用、定時任務或者process.nextTick(),而後開始進行事件循環。多線程
下面是事件循環的操做順序:併發
上圖中每一個框分別表明事件循環的一個階段,每一個階段都會維持一個先進後出的可執行回調函數隊列。每一個階段都有本身特殊的行爲方式,即當事件循環進入一個給定的階段,它執行這個階段的任何操做,而後執行這個階段隊列中的回調函數直到隊列爲空,或者回調函數調用次數達到上限。當知足這兩個條件後,事件循環會進入下一個階段。異步
在事件循環運行之間,Node.js 檢查是否有正在等待的異步I/O 或者定時器,若是沒有就清除並結束事件循環。socket
Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉而後進行處理,而後去服務下一個web請求。當這個請求完成,它被放回處理隊列,當到達隊列開頭,這個結果被返回給用戶。這個模型很是高效可擴展性很是強,由於webserver一直接受請求而不等待任何讀寫操做。函數
Node.js有多個內置的事件,能夠經過引入 events 模塊,,並經過實例化 EventEmitter 類來綁定和監聽事件。性能
// 引入 events 模塊 var events = require('events'); // 建立 eventEmitter 對象 var eventEmitter = new events.EventEmitter();
綁定事件處理程序:ui
eventEmitter.on('eventName', eventHandler);
經過程序觸發事件:
eventEmitter.emit('eventName');
下列是完整代碼(drive.js):
var events = require('events'); var eventEmitter = new events.EventEmitter(); var connectHandler = function connected() { console.log('鏈接成功'); eventEmitter.emit('data_received'); } eventEmitter.on('connection', connectHandler); eventEmitter.on('data_received', function(){ console.log('數據接收成功'); }); // 觸發 connection 事件 eventEmitter.emit('connection'); console.log("程序執行完畢");
啓動drive.js文件:
> node drive.js 鏈接成功 數據接收成功 程序執行完畢