Node.js 事件循環

什麼是事件循環

Node.js 是單進程單線程應用程序,可是由於 V8 引擎提供的異步執行回調接口,經過這些接口能夠處理大量的併發,因此性能很是高。html

事件循環能讓 Node.js 執行非阻塞 I/O 操做,儘管JavaScript事實上是單線程的,事件循環經過在可能的狀況下將相應操做分擔給系統內核來實現。node

由於目前主流的內核都是多線程的,內核能夠處理後臺執行的多個操做。當其中一個操做完成的時候,內核告訴 Node.js,與其相應的回調就被添加到輪詢隊列(poll queue)中,並最終獲得執行。web

事件循環操做

Node.js 開始的時候會初始化事件循環,處理目標腳本,腳本可能會進行異步API調用、定時任務或者process.nextTick(),而後開始進行事件循環。多線程

下面是事件循環的操做順序:併發

上圖中每一個框分別表明事件循環的一個階段,每一個階段都會維持一個先進後出的可執行回調函數隊列。每一個階段都有本身特殊的行爲方式,即當事件循環進入一個給定的階段,它執行這個階段的任何操做,而後執行這個階段隊列中的回調函數直到隊列爲空,或者回調函數調用次數達到上限。當知足這兩個條件後,事件循環會進入下一個階段。異步

各個階段介紹
  • timers(計時器):本階段執行經過setTimeout() 和 setInterval() 安排的回調函數。
  • I/O callback: 執行幾乎所有發生異常的 close 回調, 由定時器和setImmediate()計劃的回調。
  • idle,prepare:內部使用。
  • poll(輪詢): 獲取新的 I/O 事件,nodejs這時會根據實際狀況進行阻塞。
  • check: 由setImmediate() 設置的回調函數。
  • close callbacks: 例如 socket.on('close', ... )設置回調。

在事件循環運行之間,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
鏈接成功
數據接收成功
程序執行完畢

更多能夠查看:https://www.9xkd.com/3716132715.html

相關文章
相關標籤/搜索