Node單執行緒高併發原理

2021-09-07 20:49:18 字數 999 閱讀 8002

瀏覽器中的js是單執行緒的,node也是單執行緒的。這個單執行緒相當於乙個大管家,一切大小事務都要經過他的手才能辦成,它總是把io任務放入到任務池中。

雖然說是單執行緒,但是node也有乙個執行緒池專門負責執行任務池中的任務,它們把任務完成之後會告知主線程以接下來利用cpu完成處理。

關鍵在於理清哪些任務是主線程做的,哪些任務是執行緒池做的。

對於io操作(例如檔案讀取、資料庫讀取、網路請求等),基本全部是執行緒池完成的(io操作也有阻塞式的寫法);對於計算任務,都是主線程完成的。

不要小看io操作占用的時間,node的重要優勢就是把io操作放到了主線程之外,從而讓主線程騰出手來去處理更多的請求。

node的執行緒池基於libuv這個庫。

node技術的底層依賴:

以python為例,gunicorn伺服器可以指定worker數,表示可以同時處理的任務數。即便這些任務都是cpu密集型操作,gunicorn也能夠最多支援和worker數相等的請求。而node最多只能支援乙個cpu密集型任務。

簡言之,node相當於乙個worker,但是這個worker效率比較高(因為把io和計算分離開了)。

實際上,node可以通過開很多個程序,通過nginx負載均衡來實現多個worker,這樣完全可以達到和其它語言相同的效果。

簡言之,開多個worker誰都會。node的優勢在於這個優秀的單執行緒。

開多個worker應該是優化的最後一步,是實在想不出更好辦法之後的辦法。node的創新之處就在於io和計算分離,從而將併發量提高了許多。

io和計算分離是一種思想,並非只能用js實現,其它語言也可以借鑑。

cluster模組已經成為node的標準模組了,這個模組賦予了node多worker的能力。使用nginx+多個例項的方法需要占用多個埠,cluster則能夠讓多個worker共用同一埠。

原來的單執行緒模型處理計算密集型任務的執行緒只有乙個,即主線程;處理io的執行緒有多個。現在cluster通過開闢多個處理計算密集型任務的執行緒實現了多worker。

一篇cluster的詳細講解

nodejs 單執行緒 高併發

nodejs為什麼是單執行緒且支援高併發的指令碼語言呢?1.node的優點 i o密集型處理 node的i o請求都是非同步的,如 sql查詢 檔案流操作 http請求 非同步i o?顧名思義就是非同步的發出i o請求 要理解node的原理,可能還需要了解一些多執行緒或者併發的基本知識。nodejs...

Redis為什麼是單執行緒,高併發快

1.redis是基於記憶體的,記憶體的讀寫速度非常快 2.redis是單執行緒的,省去了很多上下文切換執行緒的時間 3.redis使用多路復用技術,可以處理併發的連線。非阻塞io 內部實現採用epoll,採用了epoll 自己實現的簡單的事件框架。epoll中的讀 寫 關閉 連線都轉化成了事件,然後...

node真的是單執行緒模式嗎

提到node,我們就可以立刻想到單執行緒 非同步io 事件驅動等字眼。首先要明確的是node真的是單執行緒的嗎,如果是單執行緒的,那麼非同步io,以及定時事件 settimeout setinterval等 又是在 被執行的。其實,按照嚴格來說,node並不是單執行緒的。node中存在著多種執行緒,...