国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Node.js 的異步 IO 性能探討

2024-05-06 16:09:24
字體:
供稿:網(wǎng)友
Node.js 的賣點(diǎn)是「異步單線程」,雖然主流 Web 后端編程語言中,對異步編程有很好支持的語言并不少,但只有 Node.js 喪心病狂地將所有 IO 強(qiáng)制異步進(jìn)行。
 
 

Python 和 Ruby 也有這樣的框架,但因?yàn)樵趯?shí)際使用中會不可避免地用到含有同步代碼的庫,因此沒能成長起來,而在 Node.js 之前,JavaScript 的服務(wù)器端編程幾乎是空白,所以 Node.js 才得以建立起了一個所有 IO 均為異步的代碼庫。

大部分 Web 應(yīng)用的瓶頸都在 IO, 即讀寫磁盤,讀寫網(wǎng)絡(luò),讀寫數(shù)據(jù)庫。使用怎樣的策略等待這段時間,就成了改善性能的關(guān)鍵點(diǎn)。

PHP 的策略:多進(jìn)程運(yùn)行,直接原地等待 IO 完成。缺點(diǎn):多個進(jìn)程會消耗多份內(nèi)存,進(jìn)程間難以共享數(shù)據(jù)。
C/C++ 通常的策略:多線程運(yùn)行,程序自己維護(hù)鎖的狀態(tài)。缺點(diǎn):開發(fā)成本高,容易出錯,不易調(diào)試。
Python(Tornado): 多個請求在單個進(jìn)程中輪流執(zhí)行,遇到 IO 時切換到另一個請求。缺點(diǎn):對于單個請求而言,依然沒有最高效地利用時間。
何謂「最高效地利用時間」?比如現(xiàn)在有兩個不相關(guān)的數(shù)據(jù)庫查詢,在 PHP 中通常會先執(zhí)行一個,執(zhí)行完成后再執(zhí)行第二個(總時間是 a + b). 顯然這不是最高效的,應(yīng)該同時執(zhí)行兩個查詢,時間是 max(a, b).

Python 和其他支持多線程的語言的問題就在于,在語言層面,程序員很難告訴虛擬機(jī),應(yīng)當(dāng)將兩個操作同時執(zhí)行,即使有辦法,也相當(dāng)麻煩,大多數(shù)人懶得去用(也不值得去用)。而因?yàn)?Node.js 喪心病狂地強(qiáng)制所有 IO 異步執(zhí)行,Node.js 的程序員也可以說是輕車熟路,配合一些改善代碼可讀性庫(promise, async), 可以很輕松地讓不相干的操作并行執(zhí)行。

上面講了異步 IO 的實(shí)現(xiàn),那么異步 IO 的優(yōu)勢究竟體現(xiàn)在哪里呢。實(shí)際上異步 IO 并不能神奇地減輕服務(wù)器的壓力,該加服務(wù)器還是一樣要加服務(wù)器,只不過異步 IO 會減少單個請求的時間,去掉單個請求中那些無意義的等待時間。所以單位時間內(nèi)處理的請求沒有變化,但每個請求的處理時間卻減少了。從這個角度,服務(wù)器也節(jié)約了一些資源——即維持每個請求的連接消耗的內(nèi)存。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 鲁甸县| 桐乡市| 米易县| 洪湖市| 灵璧县| 凤凰县| 九龙城区| 辽宁省| 志丹县| 武陟县| 惠水县| 邹城市| 山阴县| 隆德县| 公安县| 威海市| 荆州市| 亳州市| 金溪县| 简阳市| 民乐县| 巴中市| 桐乡市| 咸阳市| 巫溪县| 崇义县| 迁西县| 青川县| 徐汇区| 且末县| 枞阳县| 城步| 都昌县| 措勤县| 南溪县| 营山县| 长兴县| 托克逊县| 阿瓦提县| 广安市| 伊通|