由Node.js事件驱动模型引发的思考
引言
近段時間聽說了Node.js,很多文章表述這個事件驅(qū)動模型多么多么優(yōu)秀,應(yīng)用在服務(wù)器開發(fā)中有很大的優(yōu)勢,本身對此十分感性去,決定深入了解一下,由此也引發(fā)了一些對程序設(shè)計的思考,記錄下來。
什么是Node.js
Node.js在官網(wǎng)上是這樣定義的:“一個搭建在Chrome JavaScript運行時上的平臺,用于構(gòu)建高速、可伸縮的網(wǎng)絡(luò)程序。Node.js采用的事件驅(qū)動、非阻塞I/O模型使它既輕量又高效,是構(gòu)建運行在分布式設(shè)備上的數(shù)據(jù)密集型實時程序的完美選擇。”
Node.js的事件驅(qū)動
簡單來說就是只有一個線程,所有IO操作(網(wǎng)絡(luò),文件訪問等)都是異步的,通過回調(diào)來響應(yīng)處理。
Node.js做了什么
Node.js將網(wǎng)絡(luò),文件,數(shù)據(jù)庫等操作等都實現(xiàn)了異步接口,讓開發(fā)者所設(shè)計的程序只跑在一個線程上,易于設(shè)計出性能良好的高并發(fā)網(wǎng)絡(luò)程序。
如果不采用異步的方式來實現(xiàn),可能的處理方式有針對每一個連接建立一個線程處理,有多少個連接就建立多少個線程,每一個線程獨立不互相干擾。乍一看這么處理是沒有問題的,但是要知道線程的創(chuàng)建是有代價的,如果按照這么處理在連接數(shù)上萬,就已經(jīng)很難處理過來的,創(chuàng)建線程浪費了大量資源。
Node.js的劣勢
從前文的描述中可以看出Node.js的事件驅(qū)動機(jī)制在IO密集型應(yīng)用中,是有比較大的優(yōu)勢的,那么考慮另外一種場景,CPU密集型應(yīng)用(如數(shù)據(jù)加密,壓縮)。由于Node.js的代碼是在一個線程中運行的,這種情況下事件循環(huán)就被阻塞住了。當(dāng)然Node.js也提供了一下其他機(jī)制(nextTick,child_process等)解決這種場景,但是看起來這些實現(xiàn)可以說是比較丑陋的。
關(guān)于程序設(shè)計的思考
感覺Node.js的設(shè)計在IO密集型應(yīng)用上有優(yōu)勢是值得在程序設(shè)計中參考借鑒的,如果在支持多線程的語言中采用如下設(shè)計是不是既擁有事件驅(qū)動的優(yōu)勢又避免了在CPU密集型場景下的劣勢呢?
整體業(yè)務(wù)邏輯基于事件驅(qū)動的處理,可以避免許多多線程操作中繁瑣、易錯的地方。
CPU密集高運算的場景使用線程處理,主線程回調(diào)處理結(jié)果。
最后
對Node.js也只是簡單的了解一下,并未深入學(xué)習(xí),有什么錯漏大家勿噴。
來自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/vitoz/p/4872799.html
總結(jié)
以上是生活随笔為你收集整理的由Node.js事件驱动模型引发的思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦幻西游定心套问价
- 下一篇: 《霸王别姬》与《阿甘正传》两部影片导演技