自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【深入Node探究】(1)“Node特點(diǎn)與應(yīng)用場景” 有四問

開發(fā) 前端
作為后端JavaScript的運(yùn)行平臺(tái),Node保留了前端瀏覽器JavaScript中那些熟悉的接口,沒有改寫語言本身的任何特性,依舊基于作用域和原型鏈,區(qū)別在于它將前端中廣泛運(yùn)用的思想遷移到了服務(wù)器端。

[[405376]]

1、為什么叫Node?

它自身非常簡單,通過通信協(xié)議來組織很多Node,非常容易通過擴(kuò)展來達(dá)成構(gòu)建大型網(wǎng)絡(luò)應(yīng)用的目的。每一個(gè)Node進(jìn)程都構(gòu)成這個(gè)網(wǎng)絡(luò)應(yīng)用中的一個(gè)節(jié)點(diǎn),這是它名字所含意義的真諦。

2、你能說說Node的特點(diǎn)嗎?

作為后端JavaScript的運(yùn)行平臺(tái),Node保留了前端瀏覽器JavaScript中那些熟悉的接口,沒有改寫語言本身的任何特性,依舊基于作用域和原型鏈,區(qū)別在于它將前端中廣泛運(yùn)用的思想遷移到了服務(wù)器端。下面我們可以看看node相較于其他語言的一些特點(diǎn):

(1)異步I/O

關(guān)于異步I/O,向前端工程師解釋起來或許會(huì)容易一些,因?yàn)榘l(fā)起Ajax調(diào)用對(duì)于前端工程師而言是再熟悉不過的場景了。下面的代碼用于發(fā)起一個(gè)Ajax請(qǐng)求:

  1. $.post('/url', {title: ’深入淺出Node.js'}, function (data) { 
  2.     console.log(’收到響應(yīng)’); 
  3.   }); 
  4.   console.log(’發(fā)送Ajax結(jié)束’); 

熟悉異步的用戶必然知道,“收到響應(yīng)”是在“發(fā)送Ajax結(jié)束”之后輸出的。在調(diào)用$.post()后,后續(xù)代碼是被立即執(zhí)行的,而“收到響應(yīng)”的執(zhí)行時(shí)間是不被預(yù)期的。我們只知道它將在這個(gè)異步請(qǐng)求結(jié)束后執(zhí)行,但并不知道具體的時(shí)間點(diǎn)。異步調(diào)用中對(duì)于結(jié)果值的捕獲是符合“Don't call me, I will call you”的原則的,這也是注重結(jié)果,不關(guān)心過程的一種表現(xiàn)。

(2)事件與回調(diào)函數(shù)

Node不像Rhino那樣受Java的影響很大,而是將前端瀏覽器中應(yīng)用廣泛且成熟的事件引入后端,配合異步I/O,將事件點(diǎn)暴露給業(yè)務(wù)邏輯。

相比之下,無論在前端還是后端,事件都是常用的。對(duì)于其他語言來說,這種俯拾皆是JavaScript的熟悉感覺是基本不會(huì)出現(xiàn)的。

(3)單線程

Node保持了JavaScript在瀏覽器中單線程的特點(diǎn)。而且在Node中,JavaScript與其余線程是無法共享任何狀態(tài)的。

單線程的最大好處是不用像多線程編程那樣處處在意狀態(tài)的同步問題,這里沒有死鎖的存在,也沒有線程上下文交換所帶來的性能上的開銷。

同樣,單線程也有它自身的弱點(diǎn),這些弱點(diǎn)是學(xué)習(xí)Node的過程中必須要面對(duì)的。積極面對(duì)這些弱點(diǎn),可以享受到Node帶來的好處,也能避免潛在的問題,使其得以高效利用。單線程的弱點(diǎn)具體有以下3方面。

  • ❑ 無法利用多核CPU。
  • ❑ 錯(cuò)誤會(huì)引起整個(gè)應(yīng)用退出,應(yīng)用的健壯性值得考驗(yàn)。
  • ❑ 大量計(jì)算占用CPU導(dǎo)致無法繼續(xù)調(diào)用異步I/O。

像瀏覽器中JavaScript與UI共用一個(gè)線程一樣,JavaScript長時(shí)間執(zhí)行會(huì)導(dǎo)致UI的渲染和響應(yīng)被中斷。在Node中,長時(shí)間的CPU占用也會(huì)導(dǎo)致后續(xù)的異步I/O發(fā)不出調(diào)用,已完成的異步I/O的回調(diào)函數(shù)也會(huì)得不到及時(shí)執(zhí)行。

3、上面提到單線程不利于計(jì)算,無法利用多核cpu,難道沒有解決方法嗎?

有的。

Node采用了與Web Workers相同的思路來解決單線程中大計(jì)算量的問題:child_process。

子進(jìn)程的出現(xiàn),意味著Node可以從容地應(yīng)對(duì)單線程在健壯性和無法利用多核CPU方面的問題。通過將計(jì)算分發(fā)到各個(gè)子進(jìn)程,可以將大量計(jì)算分解掉,然后再通過進(jìn)程之間的事件消息來傳遞結(jié)果,這可以很好地保持應(yīng)用模型的簡單和低依賴。

4、那你可以談?wù)刵ode的使用場景嗎?

關(guān)于Node,探討得較多的主要有I/O密集型和CPU密集型。

I/O密集型

在Node的推廣過程中,無數(shù)次有人問起Node的應(yīng)用場景是什么。如果將所有的腳本語言拿到一處來評(píng)判,那么從單線程的角度來說,Node處理I/O的能力是值得豎起拇指稱贊的。通常,說Node擅長I/O密集型的應(yīng)用場景基本上是沒人反對(duì)的。Node面向網(wǎng)絡(luò)且擅長并行I/O,能夠有效地組織起更多的硬件資源,從而提供更多好的服務(wù)。

I/O密集的優(yōu)勢(shì)主要在于Node利用事件循環(huán)的處理能力,而不是啟動(dòng)每一個(gè)線程為每一個(gè)請(qǐng)求服務(wù),資源占用極少。

CPU密集型

換一個(gè)角度,在CPU密集的應(yīng)用場景中,Node是否能勝任呢?實(shí)際上,V8的執(zhí)行效率是十分高的。單以執(zhí)行效率來做評(píng)判,V8的執(zhí)行效率是毋庸置疑的。

CPU密集型應(yīng)用給Node帶來的挑戰(zhàn)主要是:由于JavaScript單線程的原因,如果有長時(shí)間運(yùn)行的計(jì)算(比如大循環(huán)),將會(huì)導(dǎo)致CPU時(shí)間片不能釋放,使得后續(xù)I/O無法發(fā)起。但是適當(dāng)調(diào)整和分解大型運(yùn)算任務(wù)為多個(gè)小任務(wù),使得運(yùn)算能夠適時(shí)釋放,不阻塞I/O調(diào)用的發(fā)起,這樣既可同時(shí)享受到并行異步I/O的好處,又能充分利用CPU。

CPU密集不可怕,如何合理調(diào)度是訣竅。

最后

這是我策劃撰寫的關(guān)于深入探討node的系列文章

 

責(zé)任編輯:姜華 來源: 前端陽光
相關(guān)推薦

2021-06-18 09:17:10

探究Node前端開發(fā)

2021-07-05 22:13:09

Node內(nèi)存控制

2021-07-08 09:48:01

NodeBuffer亂碼

2020-08-14 10:00:34

Node前端應(yīng)用

2021-06-07 09:41:48

NodeBuffer 網(wǎng)絡(luò)協(xié)議

2021-06-08 08:33:23

NodeStream數(shù)據(jù)

2014-09-25 12:08:12

微信企業(yè)號(hào)功能特點(diǎn)

2023-11-28 08:20:25

2021-06-01 08:25:06

Node.jsJavaScript運(yùn)行

2011-05-06 11:04:37

2014-05-15 09:43:11

CloudaMobile WebANodejs

2013-09-09 15:55:12

SDN應(yīng)用場景

2020-11-20 10:53:46

邊緣計(jì)算

2021-01-11 09:00:00

開發(fā)Node.js后端

2011-05-17 15:24:18

Shibboleth認(rèn)證

2023-11-13 08:31:25

SpringRedis存儲(chǔ)

2020-10-16 09:09:20

機(jī)器學(xué)習(xí)銀行技術(shù)

2022-07-24 21:56:38

元宇宙

2024-09-19 08:08:25

2024-01-03 10:32:36

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)