摘要:而線程是進程的一部分,二者相扶相依,其中單線程被稱為輕權進程或輕量級進程,執行特性線程只有個基本狀態就緒,執行,阻塞。以上所述證明了操作與其他函數的這種區別是由實現,是用多線程的方式,在標準的阻塞式上模擬非阻塞異步,線程池默認限制四線程。
node - 非阻塞的異步 IO
每當我們提起 node.js 時總會脫口而出 事件驅動、非阻塞I/O 和 單線程,所以我總結了以下幾點對這三項概念的闡述,不一定正確僅僅代表個人觀點。
單線程當一個應用程序運行時會產生一個主進程,它與其他并行執行的應用程序一起竟爭計算機系統資源,是管理和分配現有所占據資源的基本單位。每一個進程都有一個自己的地址空間(進程空間)。而線程是進程的一部分,二者相扶相依,其中單線程被稱為輕權進程或輕量級進程,執行特性:
線程只有 3 個基本狀態:就緒,執行,阻塞。
線程存在 5 種基本操作來切換線程的狀態:派生,阻塞,激活,調度,結束。
下面這個圖片簡單解釋了單線程的運作:
用 php、apache、nginx 和 node.js 做對比是因為這四個應用恰好代表四種情況,其中 php 是典型的多線程的語言,apache 則是同步多進程的代表,也就是說連接每一個連接 apache 都對應一個子進程,而 nginx 是異步多線程,近萬個連接對應一個子進程。
線程與非阻塞IO當我們說 node.js 是單線程應用的時候,實際上這種單線程只是代碼執行主程序上的單線程,在涉及到 IO 操作時仍然是多線程,下面我們看一段代碼:
var path = require("path"), fs = require("fs"); var i = 0; console.time("fs.read"); fs.read(fs.openSync(path.join(__dirname, "example.log"), "r"), 10000, 0, "utf-8", function () { console.log("1"); console.timeEnd("fs.read"); }); console.log("2"); function test(cb) { console.time("test"); console.log("3"); while (i < 300000000) { i++ } cb() } console.log("4"); test(function () { console.log("5"); console.timeEnd("test"); }); console.log("6"); //process.exit();
運行結果時:
數字標識分別為2、4、3、5、6、1,fs 和 test 同樣是回調函數一個立即執行并順序執行,而另一個延遲執行,這顯然不符合傳統的程序執行順序,也不符合有些人說的: 這種以定義當前感興趣事件發生時由系統調用的函數來取代應用返回值的編程風格被稱為事件驅動編程或者異步編程,這句話的錯誤在于是事件驅動編程 但不一定是異步編程,異步編程 的先決條件是當前執行函數正在進行 IO 操作。
如果我們把上述代碼的最后一句 //process.exit(); 的注釋拿掉,可以看到執行結果:
這種情況是因為 fs 的 IO 操作是異步,并且執行結果在 事件驅動編程 的 事件隊列 的最低端,而在它之前 process.exit(); 已經在 事件循環 過程中被從事件隊列中取出放入調用堆棧,結束了主進程。所以發生 fs 的回調結果沒有顯示,因為它已經被放在了整段代碼執行環境中的 事件隊列 的最下方(這里就是非阻塞的實例)。
以上所述證明了 IO 操作與其他函數的這種區別是由 libeio 實現,libeio 是用多線程的方式,在標準的阻塞式IO上模擬非阻塞異步,線程池默認限制四線程。
另外的 libev 事件可得到 IO 執行狀態。Node.js 的開發者在 libev 和 libeio 的基礎上還抽象出了 libuv 層: (http://docs.libuv.org/en/v1.x/design.html)。
所有的 IO操作都會轉發給由 libuv 管理的工作線程去執行,由 libuv 與 libev 和 libeio 進行交互。
事件驅動與事件循環互為犄角,其中事件循環具備兩個功能:
事件檢測
事件觸發處理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/111349.html
摘要:給出了解決方案就是單線程,遠離線程鎖,狀態同步的問題,使用異步讓單線程遠離阻塞,高效利用。而實際上的異步是采用了線程池技術,發起異步時,把操作扔到線程池里面執行,然后主線程繼續執行其他操作,執行完畢通過線程間通信通知主線程,主線程執行回調。 異步IO,事件驅動,單線程構成了node的基調,為什么異步IO在node中如此重要呢? 我們先來說一下異步的概念,異步常見于前端開發,例如ajax...
摘要:而線程是進程的一部分,二者相扶相依,其中單線程被稱為輕權進程或輕量級進程,執行特性線程只有個基本狀態就緒,執行,阻塞。以上所述證明了操作與其他函數的這種區別是由實現,是用多線程的方式,在標準的阻塞式上模擬非阻塞異步,線程池默認限制四線程。 node - 非阻塞的異步 IO 每當我們提起 node.js 時總會脫口而出 事件驅動、非阻塞I/O 和 單線程,所以我總結了以下幾點對這三項概念...
摘要:而線程是進程的一部分,二者相扶相依,其中單線程被稱為輕權進程或輕量級進程,執行特性線程只有個基本狀態就緒,執行,阻塞。以上所述證明了操作與其他函數的這種區別是由實現,是用多線程的方式,在標準的阻塞式上模擬非阻塞異步,線程池默認限制四線程。 node - 非阻塞的異步 IO 每當我們提起 node.js 時總會脫口而出 事件驅動、非阻塞I/O 和 單線程,所以我總結了以下幾點對這三項概念...
閱讀 2624·2021-11-18 10:07
閱讀 1083·2021-08-03 14:04
閱讀 726·2019-08-30 13:08
閱讀 2579·2019-08-29 15:33
閱讀 1086·2019-08-29 14:07
閱讀 2985·2019-08-29 14:04
閱讀 1435·2019-08-29 11:19
閱讀 1144·2019-08-29 10:59