nodejs不是js,而是一個(gè)讓js運(yùn)行在服務(wù)端的平臺(tái)。js(全稱JavaScript)是一種編程語(yǔ)言,而Node是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境,一種讓JavaScript運(yùn)行在服務(wù)端的開發(fā)平臺(tái)。
本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版,DELL G3電腦。
nodejs不是js,而是一個(gè)讓js運(yùn)行在服務(wù)端的平臺(tái)。
Node.js發(fā)布于2009年5月,由Ryan Dahl開發(fā),是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境,使用了一個(gè)事件驅(qū)動(dòng)、非阻塞式I/O模型, 讓JavaScript 運(yùn)行在服務(wù)端的開發(fā)平臺(tái),它讓JavaScript成為與PHP、Python、Perl、Ruby等服務(wù)端語(yǔ)言平起平坐的腳本語(yǔ)言。
JavaScript基于Node.js技術(shù)可以進(jìn)行服務(wù)器端編程。
Node.js的特點(diǎn)
非阻塞異步io
例如,當(dāng)在訪問(wèn)數(shù)據(jù)庫(kù)取得數(shù)據(jù)的時(shí)候,需要一段時(shí)間。在傳統(tǒng)的單線程處理機(jī)制中,在執(zhí)行了訪問(wèn)數(shù)據(jù)庫(kù)代碼之后,整個(gè)線程都將暫停下來(lái),等待數(shù)據(jù)庫(kù)返回結(jié)果,才能執(zhí)行后面的代碼。也就是說(shuō),I/O阻塞了代碼的執(zhí)行,極大地降低了程序的執(zhí)行效率。
由于 Node.js 中采用了非阻塞型I/O機(jī)制,因此在執(zhí)行了訪問(wèn)數(shù)據(jù)庫(kù)的代碼之后,將立即轉(zhuǎn)而執(zhí)行其后面的代碼,把數(shù)據(jù)庫(kù)返回結(jié)果的處理代碼放在回調(diào)函數(shù)中,從而提高了程序的執(zhí)行效率。
當(dāng)某個(gè)I/O執(zhí)行完畢時(shí),將以事件的形式通知執(zhí)行I/O操作的線程,線程執(zhí)行這個(gè)事件的回調(diào)函數(shù)。為了處理異步I/O,線程必須有事件循環(huán),不斷的檢查有沒有未處理的事件,依次予以處理。
阻塞模式下,一個(gè)線程只能處理一項(xiàng)任務(wù),要想提高吞吐量必須通過(guò)多線程。而非阻塞模式下,一個(gè)線程永遠(yuǎn)在執(zhí)行計(jì)算操作,這個(gè)線程的CPU核心利用率永遠(yuǎn)是100%。所以,這是一種特別有哲理的解決方案:與其人多,但是好多人閑著;還不如一個(gè)人玩命,往死里干活兒。
單線程
在 Java、PHP 或者 .net 等服務(wù)器端語(yǔ)言中,會(huì)為每一個(gè)客戶端連接創(chuàng)建一個(gè)新的線程。而每個(gè)線程需要耗費(fèi)大約2MB內(nèi)存。也就是說(shuō),理論上,一個(gè)8GB內(nèi)存的服務(wù)器可以同時(shí)連接的最大用戶數(shù)為4000個(gè)左右。要讓W(xué)eb應(yīng)用程序支持