首頁 web前端 js教程 Node.js程式碼的執行原理

Node.js程式碼的執行原理

Mar 12, 2018 pm 05:08 PM
javascript node.js 原理

這次帶給大家Node.js程式碼的執行原理,Node.js程式碼執行的注意事項有哪些,下面就是實戰案例,一起來看一下。

任何一個軟體下載安裝成功之後,其實只是一堆的機器碼,存在我們的電腦的硬碟當中,也就是我們所能看到的一堆的exe文件,當然,有的軟體比較大,可能會附的有一堆的dll檔案。

我們有兩種方式執行這個軟體:

大部分的軟體,像是QQ、飛秋、chrome瀏覽器,我們雙擊就可以執行運作起來。

有一部分的軟體,是需要在命令列裡面運行的,例如我們的node.js。

當一個軟體被執行的時候,我們的作業系統就會創建一個對應的進程,可以這麼理解,進程就是活的軟體。

進程與執行緒

電腦的核心是CPU,它承擔了所有的運算任務。它就像一座工廠,時刻在運行,假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背後的意義就是,單一CPU一次只能運行一個任務。進程就好比工廠的車間,它代表CPU所能處理的單一任務,任一時刻,CPU總是運行一個進程,其他進程處於非運作狀態。在一個車間裡,可以有很多工人,他們協同完成一個任務。線程就好比車間裡的工人,一個進程可以包含多個線程。車間的空間是工人共享的,例如許多房間是每個工人都可以進出的,這象徵一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。可是,每間房間的大小不同,有些房間最多能容納一個人,例如廁所,裡面有人的時候,其他的人就不能進去了。這代表一個執行緒使用某些共享記憶體時,其他執行緒必須等它結束,才能使用這塊記憶體。
一個防止他人進入的簡單方法,就是門口加一把鎖,先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖打開再進去,這叫互斥鎖。

為什麼JavaScript是單執行緒的?

JavaScript語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。那麼,為什麼JavaScript不能有多個執行緒呢?這樣能提高效率啊。

JavaScript的單線程,與它的用途有關。作為瀏覽器腳本語言,JavaScript的主要用途是與使用者互動,以及操作DOM。這決定了它只能是單線程,否則會帶來複雜的同步問題。例如,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上加入內容,另一個線程刪除了這個節點,這時瀏覽器應該以哪個線程為準?

所以,為了避免複雜性,從一誕生,JavaScript就是單線程,這已經變成了這門語言的核心特徵,將來也不會改變。

JavaScript是單線程的,雖然有worker、cluster等可以實現多線程,但是這些都是用來創建功能受限的線程,還是要受主線程的控制,所以,我們就認為JavaScript是單線程的。

另外,我們要明白,JavaScript是單線程的,不代表Node.js也是單線程的,Node.js運行了一個實例之後,是單進程多線程的,這裡面,有一個線程負責V8引擎解析JavaScript,有的執行緒負責libuv,也就是我們理解的事件循環。

如何理解IO:

I代表的是input,輸入:例如讀一個檔案、發起一個ajax請求資料
O代表的是output,輸出:例如寫檔案

同步vs 非同步

像下面這種,不涉及到讀寫檔案、網路請求的、計時器的,全部屬於同步程式碼:

var a = 1;var b = 2;function fn(){}
登入後複製

像下面這種都是屬於非同步程式碼:

fs.readFile('./a.js',callback);
fs.writeFile('./b.js',callback);
登入後複製

包括我們在瀏覽器端看到的一堆的滑鼠、鍵盤事件、ajax等。

Node.js裡大部分的涉及異步的物件都是繼承自event.eventEmitter事件物件

#Node.js執行程式碼的機制

我們可以把Node .js進程想像成一個餐廳:

廚師代表的是JavaScript主線程,他不停的忙著把主線程上的同步程式碼執行下去,直到執行完為止。

//同步代码var a = 1;//同步代码var b = 2;//异步代码fs.readFile('./a.js',function(err,data){    if(err)throw data;
});//同步代码var c = 3;//异步代码setTimeout(function(){
},200);//同步代码console.log(a + b + c);//同步代码function fn(){    console.log('abc');
}//异步代码fs.writeFile('./b.js',myData,function(err){    if(err)throw err;
});
登入後複製

例如像上面的這樣的程式碼,從上往下開始執行,遇到同步程式碼,直接交給廚師去完成,但遇到了異步的程式碼的時候,這時候先不執行,而是類似來了新客人一樣,交給了我們的服務員,服務員就把這個客人點的菜登記在冊,相當於把這個非同步代碼看成了一個事件,記錄到了我們的事件隊列當中。

當差不多的時候,同步程式碼全部執行完了,這時候,主線程就空閒下來了,這時候,會啟動我們的事件循環線程,這個事件循環線程就會開始去查看服務員登記的有哪些客人點了菜,然後就會按先後的優先順序,開始一個客人一個客人的炒他們的菜,也就是執行我們的那些異步代碼,因為有很多的客人,每個客人的要求不太一樣,就像我們的Node.js程式碼,有各種各樣的非同步,像是計時器、讀取檔案、取檔案、網路請求,所以Node.js專門有一堆的線程池,處理這些非同步程式碼。

當執行緒池裡的某個執行緒負責的非同步執行完成了之後,相當於這個事件完成了,就會把這個事件對應的回呼函數往主執行緒後面進行排隊。

主線程上一旦有了新的要執行的程式碼,廚師一看有事情要做了,就開始工作了。

如果主執行緒上執行的回呼函數對應的程式碼,又產生了新的非同步程式碼,那又會登記到事件循環當中。

直到某個時刻,事件佇列裡所有的事件都被執行完畢,線程池慢慢的被清空了。

node.js就會呼叫process.exit(),作業系統銷毀目前的這個node.js進程。

理解到上面基本上就夠了,下面再深入一步:

我們到了學習網路程式設計那一塊的時候,我們知道,我們知道一個伺服器容器的時候,除非我們主動的使用CTRL + C把目前的這個進程中止掉,否則會一直的等待客戶端的連線並根據對應的路由進行對應的處理。

這個又怎麼理解呢?

我們回想一下我們jQuery裡面學的API,事件監聽有兩種方式:

one 一次監聽

on 無限監聽

我們可以這樣理解:大部分的文件操作、ajax之類的,其實只需要做一次就會結束,不會再有第二次,他們就等於one類型的事件模型。

但是如果涉及網路程式設計像socket,http之類的,則相當於on無限監聽。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

angular獨立作用域的使用概念

#angularjs中$apply()的使用詳解

以上是Node.js程式碼的執行原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nohup的作用及原理解析 nohup的作用及原理解析 Mar 25, 2024 pm 03:24 PM

nohup的作用及原理解析在Unix和類Unix作業系統中,nohup是一個常用的命令,用於在後台運行命令,即便用戶退出當前會話或關閉終端窗口,命令仍然能夠繼續執行。在本文中,我們將詳細解析nohup指令的作用和原理。一、nohup的作用後台運行命令:透過nohup命令,我們可以讓需要長時間運行的命令在後台持續執行,而不受用戶退出終端會話的影響。這在需要運行

深入探討Struts框架的原理與實踐 深入探討Struts框架的原理與實踐 Feb 18, 2024 pm 06:10 PM

Struts框架的原理解析與實務探索Struts框架作為JavaWeb開發中常用的MVC框架,具有良好的設計模式和可擴展性,廣泛應用於企業級應用程式開發中。本文將對Struts框架的原理進行解析,並結合實際程式碼範例進行探索,幫助讀者更好地理解和應用該框架。一、Struts框架的原理解析1.MVC架構Struts框架是基於MVC(Model-View-Con

深入理解MyBatis中的批次Insert實作原理 深入理解MyBatis中的批次Insert實作原理 Feb 21, 2024 pm 04:42 PM

MyBatis是一款流行的Java持久層框架,廣泛應用於各種Java專案。其中,批次插入是常見的操作,可以有效提升資料庫操作的效能。本文將深入探討MyBatis中批量的Insert實作原理,並結合具體的程式碼範例進行詳細解析。 MyBatis中的批次Insert在MyBatis中,批量Insert操作通常使用動態SQL來實作。透過建構一條包含多個插入值的S

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

深入探討Linux RPM工具的功能與原理 深入探討Linux RPM工具的功能與原理 Feb 23, 2024 pm 03:00 PM

Linux系統中的RPM(RedHatPackageManager)工具是安裝、升級、解除安裝和管理系統軟體套件的強大工具。它是RedHatLinux系統中常用的軟體包管理工具,也被許多其他Linux發行版採用。 RPM工具的角色非常重要,它使得系統管理員和使用者能夠方便地管理系統上的軟體包。透過RPM,使用者可以輕鬆安裝新的軟體包,升級現有的軟體

MyBatis分頁插件原理詳解 MyBatis分頁插件原理詳解 Feb 22, 2024 pm 03:42 PM

MyBatis是一個優秀的持久層框架,它支援基於XML和註解的方式操作資料庫,簡單易用,同時也提供了豐富的插件機制。其中,分頁插件是使用頻率較高的插件之一。本文將深入探討MyBatis分頁外掛的原理,並結合具體的程式碼範例進行說明。一、分頁外掛原理MyBatis本身並沒有提供原生的分頁功能,但可以藉助外掛程式來實現分頁查詢。分頁插件的原理主要是透過攔截MyBatis

深度解析Linux chage指令的功能與工作原理 深度解析Linux chage指令的功能與工作原理 Feb 24, 2024 pm 03:48 PM

Linux系統中的chage指令是用來修改使用者帳號的密碼失效日期的指令,也可以用來修改帳號最長的可用日期等。此指令在管理使用者帳號安全性上扮演著非常重要的作用,可以有效控制使用者密碼的使用期限,並增強系統的安全性。 chage指令的使用方法:chage指令的基本語法為:chage[選項]使用者名稱例如,要修改使用者「testuser」的密碼失效日期,可以使用下列命

Golang實作繼承方法的基本原理和方式 Golang實作繼承方法的基本原理和方式 Jan 20, 2024 am 09:11 AM

Golang繼承方法的基本原理與實作方式在Golang中,繼承是物件導向程式設計的重要特性之一。透過繼承,我們可以使用父類別的屬性和方法,從而實現程式碼的複用和擴展性。本文將介紹Golang繼承方法的基本原理和實作方式,並提供具體的程式碼範例。繼承方法的基本原理在Golang中,繼承是透過嵌入結構體的方式來實現的。當一個結構體嵌入另一個結構體時,被嵌入的結構體就擁有了嵌

See all articles