node有三大特征:單線程衍慎、非阻塞I/O,事件驅動
非阻塞I/O
非阻塞 I/O皮钠,也叫異步 I/O稳捆,顯然對應的就是阻塞式 I/O
傳統(tǒng)的服務器語言大多是多線程、阻塞式 I/O麦轰。這也是 Node 與眾不同的地方乔夯,對于傳統(tǒng)的服務器語言砖织,在與用戶建立連接時,每一個連接都是一個線程末荐。 當有十萬個用戶連接時侧纯,服務器上就會有十萬個線程。而阻塞式 I/O 是指甲脏,當一個線程在執(zhí)行 I/O 操作時眶熬,這個線程會阻塞,等待 I/O 操作完成后繼續(xù)執(zhí)行块请。
舉個例子可以更好理解娜氏,比如我們到一個餐館吃飯,這個餐館比較高級墩新,服務員是一對一服務(每個用戶都是一個線程)贸弥,從我們坐下開始,服務員就把菜單給你海渊,然后在旁邊等你點菜(等待 I/O 操作)茂腥,當你看完菜單,把要點的菜告訴服務員( I/O 操作結束后線程繼續(xù)執(zhí)行)切省。在你看菜單的過程中最岗,服務員其實是被閑置的,如果你一直看朝捆,他就會一直等般渡,直到你點完( I/O 操作結束)。這就是阻塞式 I/O芙盘。
上面的例子應該可以很好地理解多線程驯用、阻塞式 I/O 。而 node 的特性是單線程儒老、非阻塞時 I/O 蝴乔。node 最大的優(yōu)勢就是性能強,同樣的服務器性能使用 node 可以比傳統(tǒng)的服務器語言多容納一百倍的用戶(對于不同的任務有不同的差別驮樊, I/O 操作越多薇正,node優(yōu)勢越明顯,如果都是 CPU 計算任務囚衔,那他倆幾乎沒有區(qū)別(上面的例子中挖腰,忽略顧客的看菜單時間)。
還是用上面的例子再比喻一下單線程练湿、非阻塞式 I/O 猴仑。這應該是個規(guī)模比較小的餐館,或者說老板比較窮肥哎,雇不起大量的服務員辽俗,因此只能雇傭一個服務員疾渣。當有顧客來時,服務員把菜單送過去崖飘,顧客開始看菜單( I/O 操作)稳衬,這個時候,服務員是被釋放了的坐漏,他不用等待顧客看菜單薄疚,服務員說:“您先看著菜單,點好了叫我”(回調函數(shù))赊琳。這個時候這個服務員就可以抽身去服務其他的顧客街夭。用這種模式的話,一個服務員就可以服務多位顧客躏筏,而且不需要等待 I/O 板丽,只需要隨時監(jiān)聽就行了,顧客點完后會主動叫服務員(執(zhí)行回調函數(shù))趁尼。
單線程埃碱、非阻塞式 I/O 的優(yōu)勢就是性能強,一個人服務員就可以解決大量顧客酥泞。但是他的缺點也很明顯砚殿,比如有一桌顧客和服務員又吵架了(線程崩了!)芝囤,那這些顧客就都完了似炎,因為所有人都在等這一個服務員。也就是說悯姊,如果線程崩掉了羡藐,那與這個服務器連接的所有用戶都會崩潰。
但是悯许,還有一個問題就是仆嗦,如果有多個顧客都在叫你,該如何響應先壕?肯定要有一定的規(guī)則瘩扼,這就涉及到了 node 的事件驅動。所以說启上,這三大特點邢隧,其實也是一個事,缺任何一個都不行冈在。
參考文檔:https://blog.csdn.net/TalonZhang/article/details/88414752