1. 程式人生 > >關於nodejs的非同步I/O模型!

關於nodejs的非同步I/O模型!

知識前提:

瞭解之前,需要掌握一下知識js引擎執行機制參考 JS的執行環境是單執行緒的,(這個執行緒就是瀏覽器的JS引擎),一次只能執行做一件事情; 瀏覽器核心實現了多個執行緒非同步執行,這些執行緒在核心的控制下相互配合從而保持同步

瀏覽器的執行緒:

瀏覽器的工作原理:

js引擎是事件驅動的,它一直在等待著任務任務佇列中的任務到來,又由於js是單執行緒的,所以很對任務會出現排隊的情況

nodejs事件迴圈機制參考

(全域性任務屬於巨集任務) 1、如果當前任務能夠直接執行,那麼直接執行 2、如果是巨集任務,則放入巨集任務佇列中 3、如果是微任務,則放入為任務佇列中 4、當執行棧為空了之後,執行整個為微任務佇列 5、但執行棧又為空了之後,則執行整個巨集任務佇列

引自這裡

雖然JavaScript是單執行緒執行的,但是瀏覽器並不是單執行緒執行的,它們有JavaScript的執行執行緒、UI節點的渲染執行緒,圖片等資源的載入執行緒,以及Ajax請求執行緒等。在Chrome設計中,為了防止因一個Tab window的奔潰而影響整個瀏覽器,它的每一個Tab被設計為一個程序;在Chrome設計中存在很多的程序,並利用程序間通訊來完成它們之間的同步,因此這也是Chrome快速的法寶之一。對於Ajax的請求也需要特殊執行緒來執行,當需要傳送一個Ajax請求的時候,瀏覽器會開闢一個新的執行緒來執行HTTP的請求,它並不會阻塞JavaScript執行緒的執行,HTTP請求狀態變更事件會被作為回撥放入到瀏覽器的事件佇列中等待被執行。

非同步I/O

現在CPU快了,但是IO一般比較慢,是很多操作的瓶頸,很容易組賽,非同步能夠緩解這種阻塞。 雖然現在的語言/平臺基本都能做到非同步,但是nodejs歷害之處能在一個執行緒裡面非同步操作,而其它語言遇到一個請求就需要再開一個執行緒,在打兵發的時候就很容易吃不消!!! 阻塞I/O:比如你要讀一個檔案,整個執行緒都暫停下來,等到檔案讀完了之後再繼續執行。也就是I/O操作阻塞了程式碼的執行,極大地降低了程式的效率 下面感受一下怎麼用Node.js實現非阻塞I/O,以讀取檔案為例:

var fs = require("fs");
fs.readFile("./testfile", "utf8", function(error, file) {  
     if (error) throw error;  
     console.log("我讀完檔案了!");
});
console.log("我不會被阻塞!");

程式碼中給readFile綁定了一個回掉函式,,並且在讀完了testfile之後執行回掉函式,期間後面的程式碼是可以繼續執行的。其實node的非同步I/O就是這麼簡單嘿嘿嘿!

一隻可愛的小前端~~