1. 程式人生 > >非同步式I/O與事件驅動--起步

非同步式I/O與事件驅動--起步

Node.js使用的是單執行緒模型,對於所有I/O都採用非同步式的請求方式,避免了頻繁的上下文切換。Node.js在執行的過程中會維護一個事件佇列,程式在執行時進入事件迴圈等待下一個事件到來,每個非同步式I/O請求完成後會被推送到事件佇列,等待程式程序進行處理。

例:一個簡單的資料庫查詢操作,按照傳統方式實現的程式碼:

res = db.query('SELECT * from some_table');
res.output();

以上程式碼在執行到第一行的時候,執行緒會阻塞,等待資料庫返回結果,然後再繼續處理。

而在Node.js中,解決方法如下:

db.query('SELECT * from some_table'
, function(res) { res.output(); });

db.query的第二個引數是一個函式,我們成為回撥函式。程序在執行到db.query的時候,不會等待結果返回,而是直接繼續執行後面的語句,直到進入事件迴圈。當資料庫查詢結果返回時,會將事件傳送到事件佇列,等到執行緒進入事件迴圈以後,才會呼叫之前的回撥函式繼續執行後面的邏輯。

Node.js的非同步機制是基於事件的,所有的磁碟I/O、網路通訊、資料庫查詢都以非阻塞的方式請求,返回的結果由事件迴圈來處理。Node.js程序在同一時間只會處理一個事件,完成後立即進入事件迴圈檢查並處理後面的事件。這樣做的好處是,CPU和記憶體在同一時間集中處理一件事,同時儘可能讓耗時的I/O操作並行執行。對於低速連線攻擊,Node.js只是在事件佇列中增加請求,等待作業系統的迴應,因而不會有任何多執行緒開銷,很大程度上可以提高Web應用的健壯性,防止惡意攻擊。

參考自《Node.js開發指南》

相關推薦

非同步I/O事件驅動--起步

Node.js使用的是單執行緒模型,對於所有I/O都採用非同步式的請求方式,避免了頻繁的上下文切換。Node.js在執行的過程中會維護一個事件佇列,程式在執行時進入事件迴圈等待下一個事件到來,每個非同步式I/O請求完成後會被推送到事件佇列,等待程式程序進行處理。

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

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

socket阻塞非阻塞,同步非同步I/O模型(轉載只為查閱方便,若有侵權,立刪)

socket阻塞與非阻塞,同步與非同步 作者:huangguisu     1. 概念理解        在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unbl

標準I/O管道;用戶、組和權限;文件處理工具及正則表達總結

程序 模式 group tails 匹配 -c 壓縮 表達 for 四、標準I/O與管道標準輸入和輸出程序:指令+數據讀入數據:Input輸出數據:Output?打開的文件都有一個fd: file descriptor (文件描述符)?Linux給程序提供三種I/O設備?標

聊聊阻塞非阻塞、同步非同步I/O模型

1. 概念理解 在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unblock)四種呼叫方式: 同步/非同步主要針對C端:  同步: 所謂同步,就是在c端發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做

網路程式設計中阻塞非阻塞、同步非同步I/O模型的理解

1. 概念理解      在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unblock)四種呼叫方式:同步:所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。 例如

Nodejs的單執行緒、非同步IO事件驅動

Nodejs的最主要的特點就是單執行緒、非同步IO、事件驅動。 單執行緒: 單執行緒其實就是按從上到下順序依次來執行,而且每次只執行一個任務,只有當前這個任務執行完了,才會執行下一個任務。在JS引擎

socket阻塞非阻塞,同步非同步I/O模型

1. 概念理解      在進行網路程式設計時,我們常常見到同步(Sync)/非同步(Async),阻塞(Block)/非阻塞(Unblock)四種呼叫方式: 同步/非同步主要針對C端: 同步:所謂同步,就是在c端發出一個功能呼叫時,在沒有得到結果之前,該

python——非同步IO事件驅動

協程 協程,又稱微執行緒,纖程。英文名Coroutine。一句話說明什麼是執行緒:協程是一種使用者態的輕量級執行緒。 協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此:

Java復習——I/O序列化

相對 字符串 方便 提升 -1 取字符 區別 off script File類 java.io.File只用於表示文件(目錄)的信息(名稱、大小等),不能用於文件內容的訪問,我們可以通過通過給其構造函數傳一個路徑來構建以文件,傳入的路徑名有一個小問題,就是Windows和

Linux下的I/O管道

sem pat 一行 處理 ces 刪除字符 .... 字符集 /etc/ 閱讀目錄1. 標準輸入輸出2.輸入輸出重定向3.tr命令4. 管道和tee5.練習 1、標準輸入輸出 (1)linux 給程序提供三種I/O設備 標準輸入 :(STDIN)

阻塞I/0 和 非阻塞I/O 同步異步詳細介紹

name 比較 基本上 b2c 復制 描述 tab 是把 分享 請求描述: `阻塞/非阻塞` 和 `同步/異步` 不是一個概念。舉幾個簡單的例子。 當進程調用一個進行IO操作的API時(比如read函數),在數據沒有到達前,read 會掛起,進程會卡住。在

Qemu模擬IO和半虛擬化Virtio的區別以及I/O半虛擬化驅動介紹

RoCE 缺少 靈活 緩沖 不支持 src 自動 令行 nic QEMU的基本原理和優缺點 基本原理: 使用QEMU模擬I/O的情況下,當客戶機中的設備驅動程序(device driver)發起I/O操作請求之時,KVM模塊中的I/O操作捕獲代碼會攔截這次I/O請求,然後

一步步動手實現高併發的Reactor模型 —— Kafka底層如何充分利用多執行緒優勢去處理網路I/O業務分發

一、從《Apeche Kafka原始碼剖析》上搬來的概念和圖 Kafka網路採用的是Reactor模式,是一種基於事件驅動的模式。熟悉Java程式設計的讀者應該瞭解Java NIO提供了Reactor模式的API。常見的單執行緒Java NIO程式設計模式如圖所示。 熟悉NIO程式設計都應該知道這個Sele

非同步、回撥、事件驅動、協程概念辨析

同步和非同步: 面試問題什麼是非同步非阻塞 A. 同步 所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。 B. 非同步 非同步的概念和同步相對。 當一個非同步過程呼叫發出後,先返回,呼叫者不會立刻得到結果。 實際處理這個呼叫的部件是在呼叫發出後, 通過狀態、通知來通知

Java NIO學習筆記---I/ONIO概述

文章目錄 一、什麼是IO 二、什麼是Java NIO 三、I/O常見概念 3.1 DMA 3.2 核心空間和使用者空間 3.3 虛擬記憶體 3.4 現代作業系統的分頁技術 3.5 面向塊(檔案)的I/O和流I/

Scala入門到精通——第十二節 I/O正則表示式

本節主要內容 Scala I/O操作簡介 Scala 寫檔案 Scala 讀檔案 Scala 網路I/O 正則表示式簡介 Scala正則表示式實戰 1. Scala I/O操作簡介 I/O操作是一門程式語言中的重要內容,在Scala中,它更多的是呼

python-檔案I/O異常處理

open函式 Python內建的open()函式開啟一個檔案,建立一個file物件,相關的輔助方法才可以呼叫它進行讀寫。語法為: file object = open(file_name [, access_mode][, buffering]) 各個引數的細節如下: 1、file_name

c# Windows窗體事件驅動

建立Windows應用程式基本步驟 開啟Visual Studio軟體 新建專案 專案型別:Visual C#專案 模板:Windows 應用程式 熟悉開發環境 窗體的常用屬性 窗體的屬性非常多, 以下是常用的幾個。 Nam

I/O主機交換資訊有哪幾種控制方式?各有何特點?

(1)程式查詢方式。其特點是主機與I/O序列工作。CPU啟動I/O後,時刻查詢I/O是否準備好,若裝置準備就緒,CPU便轉入處理I/O與主機間傳送資訊的程式;若裝置未做好準備,則CPU反覆查詢,直到I/O準備就緒為止。可見這種方式CPU效率很低 (2)程式中斷方式。其特點是主機與I/O並行工作。CP