真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Nodejs的運(yùn)行原理是什么-創(chuàng)新互聯(lián)

這篇文章主要介紹Nodejs的運(yùn)行原理是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括涇縣網(wǎng)站建設(shè)、涇縣網(wǎng)站制作、涇縣網(wǎng)頁(yè)制作以及涇縣網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,涇縣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到?jīng)芸h省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

前言

Node目前處境稍顯尷尬,很多語(yǔ)言都已經(jīng)擁有異步非阻塞的能力。阿里的思路是比較合適的,但是必須要注意,絕對(duì)不能讓node做太多的業(yè)務(wù)邏輯,他只適合接收生成好的數(shù)據(jù),然后或渲染后,或直接發(fā)送到客戶端。

為什么nodejs 還可以成為主流技術(shù)哪?

是因?yàn)閚odejs 對(duì)于大前端來(lái)說(shuō)還是非常重要的技術(shù)?。。∪绻憷斫鈔odejs 的編程原理,很容易就會(huì)理解angularjs,reactjs 和vuejs 的設(shè)計(jì)原理。

NodeJS

Node是一個(gè)服務(wù)器端JavaScript解釋器,用于方便地搭建響應(yīng)速度快、易于擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。Node使用事件驅(qū)動(dòng),非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設(shè)備上運(yùn)行數(shù)據(jù)密集型的實(shí)時(shí)應(yīng)用。
Node是一個(gè)可以讓JavaScript運(yùn)行在瀏覽器之外的平臺(tái)。它實(shí)現(xiàn)了諸如文件系統(tǒng)、模塊、包、操作系統(tǒng) API、網(wǎng)絡(luò)通信等Core JavaScript沒(méi)有或者不完善的功能。歷史上將JavaScript移植到瀏覽器外的計(jì)劃不止一個(gè),但Node.js 是最出色的一個(gè)。

相關(guān)推薦:《nodejs 教程》

V8引擎

V8 JavaScript引擎是Google用于其Chrome瀏覽器的底層JavaScript引擎。很少有人考慮JavaScript在客戶機(jī)上實(shí)際做了些什么!

實(shí)際上,JavaScript引擎負(fù)責(zé)解釋并執(zhí)行代碼。Google使用V8創(chuàng)建了一個(gè)用C++編寫(xiě)的超快解釋器,該解釋器擁有另一個(gè)獨(dú)特特征;您可以下載該引擎并將其嵌入任何應(yīng)用程序。V8 JavaScript引擎并不僅限于在一個(gè)瀏覽器中運(yùn)行。

因此,Node實(shí)際上會(huì)使用Google編寫(xiě)的V8 JavaScript引擎,并將其重建為可在服務(wù)器上使用。

事件驅(qū)動(dòng)

在我們使用Java,PHP等語(yǔ)言實(shí)現(xiàn)編程的時(shí)候,我們面向?qū)ο缶幊淌峭昝赖木幊淘O(shè)計(jì),這使得他們對(duì)其他編程方法不屑一顧。卻不知大名鼎鼎Node使用的卻是事件驅(qū)動(dòng)編程的思想。那什么是事件驅(qū)動(dòng)編程。

事件驅(qū)動(dòng)編程,為需要處理的事件編寫(xiě)相應(yīng)的事件處理程序。代碼在事件發(fā)生時(shí)執(zhí)行。

為需要處理的事件編寫(xiě)相應(yīng)的事件處理程序。要理解事件驅(qū)動(dòng)和程序,就需要與非事件驅(qū)動(dòng)的程序進(jìn)行比較。實(shí)際上,現(xiàn)代的程序大多是事件驅(qū)動(dòng)的,比如多線程的程序,肯定是事件驅(qū)動(dòng)的。早期則存在許多非事件驅(qū)動(dòng)的程序,這樣的程序,在需要等待某個(gè)條件觸發(fā)時(shí),會(huì)不斷地檢查這個(gè)條件,直到條件滿足,這是很浪費(fèi)cpu時(shí)間的。而事件驅(qū)動(dòng)的程序,則有機(jī)會(huì)釋放cpu從而進(jìn)入睡眠態(tài)(注意是有機(jī)會(huì),當(dāng)然程序也可自行決定不釋放cpu),當(dāng)事件觸發(fā)時(shí)被操作系統(tǒng)喚醒,這樣就能更加有效地使用cpu。
來(lái)看一張簡(jiǎn)單的事件驅(qū)動(dòng)模型(uml):

事件驅(qū)動(dòng)模型主要包含3個(gè)對(duì)象:事件源、事件和事件處理程序。

?  事件源:產(chǎn)生事件的地方(html元素)

?  事件:點(diǎn)擊/鼠標(biāo)操作/鍵盤(pán)操作等等

?  事件對(duì)象:當(dāng)某個(gè)事件發(fā)生時(shí),可能會(huì)產(chǎn)生一個(gè)事件對(duì)象,該時(shí)間對(duì)象會(huì)封裝好該時(shí)間的信息,傳遞給事件處理程序

?  事件處理程序:響應(yīng)用戶事件的代碼

運(yùn)行原理

當(dāng)我們搜索Node.js時(shí),奪眶而出的關(guān)鍵字就是 “單線程,異步I/O,事件驅(qū)動(dòng)”,應(yīng)用程序的請(qǐng)求過(guò)程可以分為倆個(gè)部分:CPU運(yùn)算和I/O讀寫(xiě),CPU計(jì)算速度通常遠(yuǎn)高于磁盤(pán)讀寫(xiě)速度,這就導(dǎo)致CPU運(yùn)算已經(jīng)完成,但是不得不等待磁盤(pán)I/O任務(wù)完成之后再繼續(xù)接下來(lái)的業(yè)務(wù)。
所以I/O才是應(yīng)用程序的瓶頸所在,在I/O密集型業(yè)務(wù)中,假設(shè)請(qǐng)求需要100ms來(lái)完成,其中99ms化在I/O上。如果需要優(yōu)化應(yīng)用程序,讓他能同時(shí)處理更多的請(qǐng)求,我們會(huì)采用多線程,同時(shí)開(kāi)啟100個(gè)、1000個(gè)線程來(lái)提高我們請(qǐng)求處理,當(dāng)然這也是一種可觀的方案。
但是由于一個(gè)CPU核心在一個(gè)時(shí)刻只能做一件事情,操作系統(tǒng)只能通過(guò)將CPU切分為時(shí)間片的方法,讓線程可以較為均勻的使用CPU資源。但操作系統(tǒng)在內(nèi)核切換線程的同時(shí)也要切換線程的上線文,當(dāng)線程數(shù)量過(guò)多時(shí),時(shí)間將會(huì)被消耗在上下文切換中。所以在大并發(fā)時(shí),多線程結(jié)構(gòu)還是無(wú)法做到強(qiáng)大的伸縮性。
那么是否可以另辟蹊徑呢?!我們先來(lái)看看單線程,《深入淺出Node》一書(shū)提到 “單線程的較大好處,是不用像多線程編程那樣處處在意狀態(tài)的同步問(wèn)題,這里沒(méi)有死鎖的存在,也沒(méi)有線程上下文切換所帶來(lái)的性能上的開(kāi)銷”,那么一個(gè)線程一次只能處理一個(gè)請(qǐng)求豈不是無(wú)稽之談,先讓我們看張圖:

Nodejs的運(yùn)行原理是什么

Node.js的單線程并不是真正的單線程,只是開(kāi)啟了單個(gè)線程進(jìn)行業(yè)務(wù)處理(cpu的運(yùn)算),同時(shí)開(kāi)啟了其他線程專門(mén)處理I/O。當(dāng)一個(gè)指令到達(dá)主線程,主線程發(fā)現(xiàn)有I/O之后,直接把這個(gè)事件傳給I/O線程,不會(huì)等待I/O結(jié)束后,再去處理下面的業(yè)務(wù),而是拿到一個(gè)狀態(tài)后立即往下走,這就是“單線程”、“異步I/O”。
I/O操作完之后呢?Node.js的I/O 處理完之后會(huì)有一個(gè)回調(diào)事件,這個(gè)事件會(huì)放在一個(gè)事件處理隊(duì)列里頭,在進(jìn)程啟動(dòng)時(shí)node會(huì)創(chuàng)建一個(gè)類似于While(true)的循環(huán),它的每一次輪詢都會(huì)去查看是否有事件需要處理,是否有事件關(guān)聯(lián)的回調(diào)函數(shù)需要處理,如果有就處理,然后加入下一個(gè)輪詢,如果沒(méi)有就退出進(jìn)程,這就是所謂的“事件驅(qū)動(dòng)”。這也從Node的角度解釋了什么是”事件驅(qū)動(dòng)”。
在node.js中,事件主要來(lái)源于網(wǎng)絡(luò)請(qǐng)求,文件I/O等,根據(jù)事件的不同對(duì)觀察者進(jìn)行了分類,有文件I/O觀察者,網(wǎng)絡(luò)I/O觀察者。事件驅(qū)動(dòng)是一個(gè)典型的生產(chǎn)者/消費(fèi)者模型,請(qǐng)求到達(dá)觀察者那里,事件循環(huán)從觀察者進(jìn)行消費(fèi),主線程就可以馬不停蹄的只關(guān)注業(yè)務(wù)不用再去進(jìn)行I/O等待。

優(yōu)點(diǎn)

Node 公開(kāi)宣稱的目標(biāo)是 “旨在提供一種簡(jiǎn)單的構(gòu)建可伸縮網(wǎng)絡(luò)程序的方法”。我們來(lái)看一個(gè)簡(jiǎn)單的例子,在 Java和 PHP 這類語(yǔ)言中,每個(gè)連接都會(huì)生成一個(gè)新線程,每個(gè)新線程可能需要 2 MB 的配套內(nèi)存。在一個(gè)擁有 8 GB RAM 的系統(tǒng)上,理論上較大的并發(fā)連接數(shù)量是 4,000 個(gè)用戶。隨著您的客戶群的增長(zhǎng),如果希望您的 Web 應(yīng)用程序支持更多用戶,那么,您必須添加更多服務(wù)器。所以在傳統(tǒng)的后臺(tái)開(kāi)發(fā)中,整個(gè) Web 應(yīng)用程序架構(gòu)(包括流量、處理器速度和內(nèi)存速度)中的瓶頸是:服務(wù)器能夠處理的并發(fā)連接的較大數(shù)量。這個(gè)不同的架構(gòu)承載的并發(fā)數(shù)量是不一致的。
而Node的出現(xiàn)就是為了解決這個(gè)問(wèn)題:更改連接到服務(wù)器的方式。在Node 聲稱它不允許使用鎖,它不會(huì)直接阻塞 I/O 調(diào)用。Node在每個(gè)連接發(fā)射一個(gè)在 Node 引擎的進(jìn)程中運(yùn)行的事件,而不是為每個(gè)連接生成一個(gè)新的 OS 線程(并為其分配一些配套內(nèi)存)。

缺點(diǎn)

如上所述,nodejs的機(jī)制是單線程,這個(gè)線程里面,有一個(gè)事件循環(huán)機(jī)制,處理所有的請(qǐng)求。在事件處理過(guò)程中,它會(huì)智能地將一些涉及到IO、網(wǎng)絡(luò)通信等耗時(shí)比較長(zhǎng)的操作,交由worker threads去執(zhí)行,執(zhí)行完了再回調(diào),這就是所謂的異步IO非阻塞吧。但是,那些非IO操作,只用CPU計(jì)算的操作,它就自己扛了,比如算什么斐波那契數(shù)列之類。它是單線程,這些自己扛的任務(wù)要一個(gè)接著一個(gè)地完成,前面那個(gè)沒(méi)完成,后面的只能干等。因此,對(duì)CPU要求比較高的CPU密集型任務(wù)多的話,就有可能會(huì)造成號(hào)稱高性能,適合高并發(fā)的node.js服務(wù)器反應(yīng)緩慢。

適合場(chǎng)景

1、RESTful API

這是適合 Node 的理想情況,因?yàn)槟梢詷?gòu)建它來(lái)處理數(shù)萬(wàn)條連接。它仍然不需要大量邏輯;它本質(zhì)上只是從某個(gè)數(shù)據(jù)庫(kù)中查找一些值并將它們組成一個(gè)響應(yīng)。由于響應(yīng)是少量文本,入站請(qǐng)求也是少量的文本,因此流量不高,一臺(tái)機(jī)器甚至也可以處理最繁忙的公司的 API 需求。

2、實(shí)時(shí)程序

比如聊天服務(wù)

聊天應(yīng)用程序是最能體現(xiàn) Node.js 優(yōu)點(diǎn)的例子:輕量級(jí)、高流量并且能良好的應(yīng)對(duì)跨平臺(tái)設(shè)備上運(yùn)行密集型數(shù)據(jù)(雖然計(jì)算能力低)。同時(shí),聊天也是一個(gè)非常值得學(xué)習(xí)的用例,因?yàn)樗芎?jiǎn)單,并且涵蓋了目前為止一個(gè)典型的 Node.js 會(huì)用到的大部分解決方案。

3、單頁(yè)APP

ajax很多。現(xiàn)在單頁(yè)的機(jī)制似乎很流行,比如phonegap做出來(lái)的APP,一個(gè)頁(yè)面包打天下的例子比比皆是。

總而言之,NodeJS適合運(yùn)用在高并發(fā)、I/O密集、少量業(yè)務(wù)邏輯的場(chǎng)景

以上是“Nodejs的運(yùn)行原理是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)站題目:Nodejs的運(yùn)行原理是什么-創(chuàng)新互聯(lián)
路徑分享:http://weahome.cn/article/dcejdd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部