1. 程式人生 > >NODE事件驅動

NODE事件驅動

基本概念

  1. 事件: 事件是可以被 JavaScript 偵測到的行為,如onclick()。
  2. 事件驅動:只有當事件發生時候才會呼叫回撥函式,這種函式執行的方式叫做事件驅動。
  3. 基於事件驅動的回撥:通過事件驅動方式實現的回撥叫做基於事件驅動的回撥。如果和io有關就可以叫做基於非同步回撥的io。
  4. 事件迴圈:Event loop有大量的非同步操作完成時需要呼叫相應回撥函式,需要一種機制來管理執行先後,這種機制就叫做事件迴圈。node.js不斷查詢任務佇列中是否有事件,查詢到事件,呼叫相應javascript函式,機制為先進先出任務佇列。

好處

  • 一個典型的事件驅動的程式,就是一個以執行緒形式存在的死迴圈,這個死迴圈包括兩個部分,第一個部分是按照一定的條件接收並選擇一個要處理的事件,第二個部分就是事件的處理過程。程式的執行過程就是選擇事件和處理事件,而當沒有任何事件觸發時,程式會因查詢事件佇列失敗而進入睡眠狀態,從而釋放cpu。

  • 事件驅動的程式,必定會直接或者間接擁有一個事件佇列,用於儲存未能及時處理的事件。

  • 事件驅動的程式可以按照一定的順序處理佇列中的事件,而這個順序則是由事件的觸發順序決定的。

  • 事件驅動的程式能夠讓CPU 和記憶體在同一時間集中處理一件事,同時儘可能讓耗時的 I/O 操作並行執行。對於低速連線攻擊,Node.js 只是在事件佇列中增加請求,等待作業系統的迴應,因而不會有任何多執行緒開銷,很大程度上可以提高 Web 應用的健壯性,防止惡意攻擊。

相關事例

在基於執行緒的方式中(thread-based way)你到了櫃檯前,把你的點餐單給收銀員或者給收銀員直接點餐,然後等在那直到你要的食物準備好給你。收銀員不能接待下一個人,除非你拿到食物離開。想接待更多的客戶,容易!加更多的收銀員!

當然,我們知道快餐店其實不是這樣工作的。他們其實就是基於事件驅動方式,這樣收銀員更高效。只要你把點餐單給收銀員,某個人已經開始準備你的食物,而同時收銀員在進行收款,當你付完錢,你就站在一邊而收銀員已經開始接待下一個客戶。在一些餐館,甚至會給你一個號碼,如果你的食物準備好了,就呼叫你的號碼讓你去櫃檯取。關鍵的一點是,你沒有阻塞下一個客戶的訂餐請求。你訂餐的食物做好的事件會導致某個人做某個動作(某個服務員喊你的訂單號碼,你聽到你的號碼被喊到去取食物),在程式設計領域,我們稱這個為回撥(callback function)。

基本思路

這裡寫圖片描述

  1. 當有請求發生時,node.js將這些請求放到佇列中,此時不佔CPU只佔記憶體佇列
  2. 事件迴圈從佇列中解析這些請求,如果存在回撥函式,判斷是否存在阻塞,存在的話事件迴圈從執行緒池中檢索一個執行緒,否則,直接執行回撥。回撥函式主要執行的操作是:1.傳送一個響應 2.安排另一個事件 3.結束程式。
  3. 當程式執行到回撥函式時,瀏覽器執行回撥函式。

    類比於點餐事件。當A點餐時,點餐系統會生成A的訂單放入訂單佇列中,B點餐原理同上。後廚(事件迴圈)會根據訂單製作相應的食物。如果只有一個廚師,而訂單很多,廚師一般會將訂單放在一起(執行緒池)檢視有無相同的食物。當前臺進行催單時,廚師會優先製作催單的食物(這相當於是當程式執行到指定的行時會優先執行相應的回撥函式)。

相關推薦

NODE事件驅動

基本概念 事件: 事件是可以被 JavaScript 偵測到的行為,如onclick()。 事件驅動:只有當事件發生時候才會呼叫回撥函式,這種函式執行的方式叫做事件驅動。 基於事件驅動的回撥:通過事件驅動方式實現的回撥叫做基於事件驅動的回撥。如果和io有關就

node.js 事件驅動

在傳統程式設計中,i/o操作和本地函式呼叫的處理方式相同:處理過程需要一直等待直到某個操作結束才能繼續下去,這種基於i/o操作的阻塞式程式設計模型繼承自早期的分時系統,在這類系統中,每一個程序都對應著一個使用者,這樣做的目的是使得使用者之間相互隔離。並且在這類系統中,使用者在決定下一個操作前,必須先

Node-單執行緒、事件驅動、非阻塞I/O

Nodejs既然這麼流行就肯定有它的博大精深之處,自然不是我這還沒入門的小白可以掌握的,我就簡單說一下目前自己的理解程度。 一、單執行緒、非阻塞I/O、事件驅動 這是nodejs的三個特點。 單執行緒 Nodejs是單執行緒,和多執行緒相比: 優點:可以避免系統分配多執行緒以及執行

Node學習筆記——NodeJS的事件驅動

首先來介紹一下NodeJS的事件驅動的概念:          Node.js 所有的非同步 I/O 操作在完成時都會發送一個事件到事件佇列。在開發者看來,事件由 EventEmitter 物件提供。前面提到的 fs.readFile 和 http.createServer

Node.js 事件驅動獲取資料

Nodejs的單執行緒非阻塞I/O事件驅動 在 Java、PHP 或者.net 等伺服器端語言中,會為每一個客戶端連線建立一個新的執行緒。 而每個執行緒需要耗費大約 2MB 記憶體。也就是說,理論上,一個 8GB 記憶體的伺服器可以同時 連線的最大使用者數為

node.js util全域性變數和事件驅動events

一、util全域性變數         1.util.inherits(constructor,superConstructor)             此方法是一個實現物件間原型繼承的函式。javaScript通過原型賦值來實現繼承,細節可參考雲哥JS高階視訊(原型)。

【NodeJS】深入理解Node.js基於事件驅動的回撥

回撥和非同步呼叫的關係   首先明確一點,回撥並非是非同步呼叫,回撥是一種解決非同步函式執行結果的處理方法。在非同步呼叫,如果我們希望將執行的結果返回並且處理時,可以通過回撥的方法解決。為了能夠更好的區分回撥和非同步回撥的區別,我們來看一個簡單的例子,程式碼如

node.js 基於事件驅動的回撥

基於事件驅動的回撥 當我們使用 http.createServer 方法的時候,我們當然不只是想要一個偵聽某個埠的伺服器,我們還想要它在伺服器收到一個HTTP請求的時候做點什麼。 問題是,這是非同步的:請求任何時候都可能到達,但是我們的伺服器卻跑在一個單程序中。 寫

node.js的事件驅動

node.js在執行的過程中會維護一個事件佇列。 程式在執行時進入事件迴圈等待下一個事件到來,每個非同步I/O請求完成後被推送到事件佇列,等待程式程序進行處理。 node.js的非同步機制是基於事件的,所有的磁碟I/O,網路通訊,資料庫查詢都是以非阻塞的方式請求的,返回的結

node:基於事件驅動的回撥

那麼在我們的Node.js程式中,當一個新的請求到達8888埠的時候,我們怎麼控制流程呢? 嗯,這就是Node.js/JavaScript的事件驅動設計能夠真正幫上忙的地方了——雖然我們還得學一些新概念才能掌握它。讓我們來看看這些概念是怎麼應用在我們的伺服器程式碼裡的。 我們建立了伺服器,並且向建立它

node.js util全域性變數 事件驅動events

一、util全域性變數         1.util.inherits(constructor,superConstructor)             此方法是一個實現物件間原型繼承的函式。javaScript通過原型賦值來實現繼承,細節可參考雲哥JS高階視訊(原型)。

node.js的非同步I/O、事件驅動、單執行緒

nodejs的特點總共有以下幾點 非同步I/O(非阻塞I/O) 事件驅動 單執行緒 擅長I/O密集型,不擅長CPU密集型 高併發 下面是一道很經典的面試題,描述了node的整體執行機制,相信很多人都碰到了。這道題背後的原理就是nodejs程式碼執行順序 setTimeout(function()

[WF4.0 實戰] 事件驅動應用

and -c put 啟動 eas ets 執行 bookmark 右鍵 看到題目或許非常多人都會疑問,為什麽要使用事件監聽呢? 眼下的認識: 1,使用事件監聽能夠將工作流的結點返回值返回到client 2,能夠實現等待與重新啟動,相當於之前的WaitAct

nodejs 事件驅動

訪問 服務器 fun pac ebs ng- 請求 介紹 基本 nodejs一個最大的特點就是支持事件驅動(並發) http://www.cnblogs.com/lua5/archive/2011/02/01/1948760.html Node.js現在非常活躍,相關生態社

Guava ---- EventBus事件驅動模型

sim div spa tar 共享 execution ext 實例 處理 在軟件開發過程中, 難免有信息的共享或者對象間的協作。 怎樣讓對象間信息共享高效, 而且耦合性低。 這是一個難題。 而耦合性高將帶來編碼改動牽一發而動全身的連鎖效應。 Spring的風靡正

事件驅動

params where class name tee ocp 思路 contain str 前言 上一篇說到為什麽要使用事件驅動,但是只有概念是不夠的,我們要代碼呀!記得臉書的老總說過: “Talk is cheap, Show me the code!&r

事件驅動模型

image 獨立 之間 如果 png 實例 相等 不知道 響應時間 一、為什麽要用事件驅動模型? 在UI編程中,常常要對鼠標點擊進行相應,首先如何獲得鼠標點擊呢?方式一:創建一個線程,該線程一直循環檢測是否有鼠標點擊。 那麽這個方式有以下幾個缺點:1. CPU資源浪費,可能

單片機的非OS的事件驅動

初始 設定 比較 -o scan ner 檢測模塊 缺點 其他 單片機的非OS的事件驅動 Part 1  前言   很多單片機項目恐怕都是沒有操作系統的前後臺結構,就是main函數裏用while無限循環各種任務,中斷處理緊急任務。這種結構最簡單,上手很容易,可是當項目比較大

事件驅動模式--Reactor

.net 事件 inux nts 準備就緒 所有 behavior 系統 pro 1 Reactor模型   Reactor模式是處理並發I/O比較常見的一種模式,用於同步I/O,中心思想是將所有要處理的I/O事件註冊到一個中心I/O多路復用器上,同時主線程/進程阻塞在多路

事件驅動與多路IO復用

監聽 sea [] env tar 才有 可能 exception tput 通常,我們寫服務器處理模型的程序時,有以下幾種模型: (1)每收到一個請求,創建一個新的進程,來處理該請求; (2)每收到一個請求,創建一個新的線程,來處理該請求; (3)每收到一個請求,放入一