瀏覽器中的js是單線程的,node也是單線程的。這個單線程至關於一個大管家,一切大小事務都要通過他的手才能辦成,它老是把IO任務放入到任務池中。
雖說是單線程,可是node也有一個線程池專門負責執行任務池中的任務,它們把任務完成以後會告知主線程以接下來利用CPU完成處理。
關鍵在於理清哪些任務是主線程作的,哪些任務是線程池作的。
對於IO操做(例如文件讀取、數據庫讀取、網絡請求等),基本所有是線程池完成的(IO操做也有阻塞式的寫法);對於計算任務,都是主線程完成的。
不要小看IO操做佔用的時間,node的重要優點就是把IO操做放到了主線程以外,從而讓主線程騰出手來去處理更多的請求。 node的線程池基於libuv這個庫。node
node技術的底層依賴:python
以python爲例,gunicorn服務器能夠指定worker數,表示能夠同時處理的任務數。即使這些任務都是CPU密集型操做,gunicorn也可以最多支持和worker數相等的請求。而node最多隻能支持一個CPU密集型任務。
簡言之,node至關於一個worker,可是這個worker效率比較高(由於把IO和計算分離開了)。 實際上,node能夠經過開不少個進程,經過nginx負載均衡來實現多個worker,這樣徹底能夠達到和其它語言相同的效果。 簡言之,開多個worker誰都會。node的優點在於這個優秀的單線程。
開多個worker應該是優化的最後一步,是實在想不出更好辦法以後的辦法。node的創新之處就在於IO和計算分離,從而將併發量提升了許多。
IO和計算分離是一種思想,並不是只能用js實現,其它語言也能夠借鑑。nginx
cluster模塊已經成爲node的標準模塊了,這個模塊賦予了node多worker的能力。使用nginx+多個實例的方法須要佔用多個端口,cluster則可以讓多個worker共用同一端口。
原來的單線程模型處理計算密集型任務的線程只有一個,即主線程;處理IO的線程有多個。如今cluster經過開闢多個處理計算密集型任務的線程實現了多worker。web
一篇cluster的詳細講解 https://blog.csdn.net/leohzj/article/details/50462231數據庫