nodejs如何解決高并發(fā)問題
Node可以在不新增額外線程的情況下,依然可以對任務(wù)進(jìn)行并發(fā)處理 —— Node.js是單線程的。
它通過事件循環(huán)(event loop)來實(shí)現(xiàn)并發(fā)操作,對此,我們應(yīng)該要充分利用這一點(diǎn) —— 盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。
node單線程實(shí)現(xiàn)高并發(fā)原理
眾所周知nodejs是單線程且支持高并發(fā)的腳本語言。
可為什么單線程的nodejs可以支持高并發(fā)呢?
很多人都不明白其原理,下面我來談?wù)勎业睦斫猓?/p>
node的優(yōu)點(diǎn)
I/O密集型處理是node的強(qiáng)項,因為node的I/O請求都是異步的(如:sql查詢請求、文件流操作操作請求、http請求...)
- a. 什么是異步?
異步:發(fā)出操作指令,然后就可以去做別的事情了(主線程不需要等待),所有操作完成后再執(zhí)行回調(diào)
異步的示例:
// 第一步:定義變量
let a = 1;
// 第二步:發(fā)出指令,然后把回調(diào)函數(shù)加入事件隊列(回調(diào)函數(shù)并沒有執(zhí)行)
setTimeout(() => {
console.log(a);
}, 0)
// 第三步:賦值,回調(diào)函數(shù)沒有執(zhí)行
a = 2;
// 第四步:發(fā)出指令,然后把回調(diào)函數(shù)加入異步隊列(回調(diào)函數(shù)并沒有執(zhí)行)
setTimeout(() => {
console.log(a);
}, 0)
// 第五步:賦值,回調(diào)函數(shù)沒有執(zhí)行
a = 3;
// 當(dāng)所有代碼執(zhí)行完畢,cpu空閑下來了,就會開始遍歷執(zhí)行事件隊列里面的回調(diào)函數(shù)
// 所以最后控制臺輸出:3 3- b. 擁有異步I/O的node為什么可以支持高并發(fā)呢?
因為I/O操作是由node的工作線程去執(zhí)行的(nodejs底層的libuv是多線程的線程池用來并行io操作),且主線程是不需要等待結(jié)果返回的,只要發(fā)出指令馬上就可以去忙其他事情了?! ?strong>
額外知識點(diǎn)
- c. 雖然nodejs的I/O操作開啟了多線程,但是所有線程都是基于node服務(wù)進(jìn)程開啟的,并不能充分利用cpu資源
pm2進(jìn)程管理器可以解決這個問題
pm2 是一個帶有負(fù)載均衡功能的Node應(yīng)用的進(jìn)程管理器.
- d. cpu核數(shù)與線程之間的關(guān)系
在過去單CPU時代,單任務(wù)在一個時間點(diǎn)只能執(zhí)行單一程序。之后發(fā)展到多任務(wù)階段,計算機(jī)能在同一時間點(diǎn)并行執(zhí)行多任務(wù)或多進(jìn)程。
雖然并不是真正意義上的“同一時間點(diǎn)”,而是多個任務(wù)或進(jìn)程共享一個CPU,并交由操作系統(tǒng)來完成多任務(wù)間對CPU的運(yùn)行切換,以使得每個任務(wù)都有機(jī)會獲得一定的時間片運(yùn)行。
而現(xiàn)在多核CPU的情況下,同一時間點(diǎn)可以執(zhí)行多個任務(wù),具體到這個任務(wù)在CPU哪個核上運(yùn)行,這個就跟操作系統(tǒng)和CPU本身的設(shè)計相關(guān)了
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nodejs多站點(diǎn)切換Htpps協(xié)議詳解及簡單實(shí)例
這篇文章主要介紹了Nodejs多站點(diǎn)切換Htpps協(xié)議詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
Node.js學(xué)習(xí)教程之HTTP/2服務(wù)器推送【譯】
這篇文章主要給大家介紹了關(guān)于Node.js學(xué)習(xí)教程之HTTP/2服務(wù)器推送的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
node.js通過axios實(shí)現(xiàn)網(wǎng)絡(luò)請求的方法
下面小編就為大家分享一篇node.js通過axios實(shí)現(xiàn)網(wǎng)絡(luò)請求的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
從reflect?metadata理解Nest實(shí)現(xiàn)原理
這篇文章主要為大家介紹了從reflect?metadata理解Nest實(shí)現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
npm報錯:request to httpsregistry.npm.taobao.org 
這篇文章主要介紹了npm報錯:request to httpsregistry.npm.taobao.org failed, reason certificate has expired的解決方案,文中有詳細(xì)的解決方案,需要的朋友可以參考下2024-03-03

