說明:也許你會問,爲何還不安裝nodejs?還不寫代碼?還不講模塊?前面我說過,不會一來就hello world。而是會先跟你們講講nodejs的特色,只有你們明白、理解nodejs的特色,在後面的模塊學習中,會有種豁然開朗的感受,也會更加明白爲何nodejs會這樣設計;比起一上來就看文檔、寫代碼更加事半功倍;比起代碼層面的東西,原理更爲重要!php
在php,java語言中,會爲每個客戶端鏈接都建立一個新的線程。以php(php-fpm、單進程單線程)爲例,每個php-fpm工做線程大概消耗20M內存,一個8G的服務器,大概同時支持400個左右客戶端鏈接。要想支持更加多的客戶端鏈接,只能增長服務器數量,這樣一來硬件的費用成本就上來了。java
在nodejs始終只有惟一一個線程,它不爲每個客戶端的鏈接新開線程。據某些測試,一個8G內存的服務器同時支持4萬了鏈接。nodejs經過本身內部事件機制、異步I/O,在宏觀上達到並行。node
例子說明:
如一個任務中有3個線程;
在多線程中(圖1),它3個線程是同時並行的,但因爲每一個線程中都有I/O操做,都要等阻塞I/O完成後才能進行下面的程序。服務器
圖1多線程
在Nodejs單線程中,首先會把全部要執行的線程放到「事件棧」中,在開始執行第一個線程後,遇到I/O時,會立刻把當前的I/o操做放到事件棧中並開始執行線程2;當線程1的I/O執行完成後,程序會回到線程1,並執行線程1的程序2;當線程2中遇到I/O,也會放到事件棧中;程序轉而去處理其餘;就是這樣的循環,讓程序達到並行效果,這個線程的利用率是100%的。異步
圖2php-fpm
若是你還不明白的話,咱們能夠用生活的例子來進一步說明:餐廳和服務員的關係;多線程--招不少個服務員,每一個服務員幹特定的活(點菜、沖茶、收桌子),幹完本身的活後能夠休息;而單線程--只招了一個服務員,全部的活都有他本身一我的幹,幹什麼他本身決定,甚至點菜乾到一半,去把沖茶幹完後,再回來繼續點菜也能夠。學習
另外,單線程中,操做系統沒有建立、銷燬線程的時間開銷。
單線程缺點:若是有用戶形成線程崩潰,那個整個系統都崩潰了。(不過nodejs很難崩潰,會有相應的錯誤事件處理)測試