cpu多核 node 单线程_node单线程支撑高并发原理(node异步I/O)
一、node單線程實(shí)現(xiàn)高并發(fā)原理
眾所周知nodejs是單線程且支持高并發(fā)的腳本語言。可為什么單線程的nodejs可以支持高并發(fā)呢?很多人都不明白其原理,下面我來談?wù)勎业睦斫?#xff1a;
1. node的優(yōu)點(diǎn):I/O密集型處理是node的強(qiáng)項(xiàng),因?yàn)閚ode的I/O請求都是異步的(如:sql查詢請求、文件流操作操作請求、http請求...)
a. 什么是異步?
異步:發(fā)出操作指令,然后就可以去做別的事情了(主線程不需要等待),所有操作完成后再執(zhí)行回調(diào)
異步的示例:
//第一步:定義變量
let a = 1;//第二步:發(fā)出指令,然后把回調(diào)函數(shù)加入事件隊(duì)列(回調(diào)函數(shù)并沒有執(zhí)行)
setTimeout(() =>{
console.log(a);
},0)//第三步:賦值,回調(diào)函數(shù)沒有執(zhí)行
a = 2;//第四步:發(fā)出指令,然后把回調(diào)函數(shù)加入異步隊(duì)列(回調(diào)函數(shù)并沒有執(zhí)行)
setTimeout(() =>{
console.log(a);
},0)//第五步:賦值,回調(diào)函數(shù)沒有執(zhí)行
a = 3;//當(dāng)所有代碼執(zhí)行完畢,cpu空閑下來了,就會(huì)開始遍歷執(zhí)行事件隊(duì)列里面的回調(diào)函數(shù)//所以最后控制臺輸出:3 3
b. 擁有異步I/O的node為什么可以支持高并發(fā)呢?
因?yàn)镮/O操作是由node的工作線程去執(zhí)行的(nodejs底層的libuv是多線程的線程池用來并行io操作),且主線程是不需要等待結(jié)果返回的,只要發(fā)出指令馬上就可以去忙其他事情了。
額外知識點(diǎn):
c. 雖然nodejs的I/O操作開啟了多線程,但是所有線程都是基于node服務(wù)進(jìn)程開啟的,并不能充分利用cpu資源
pm2進(jìn)程管理器可以解決這個(gè)問題
pm2 是一個(gè)帶有負(fù)載均衡功能的Node應(yīng)用的進(jìn)程管理器.
d. cpu核數(shù)與線程之間的關(guān)系
在過去單CPU時(shí)代,單任務(wù)在一個(gè)時(shí)間點(diǎn)只能執(zhí)行單一程序。之后發(fā)展到多任務(wù)階段,計(jì)算機(jī)能在同一時(shí)間點(diǎn)并行執(zhí)行多任務(wù)或多進(jìn)程。雖然并不是真正意義上的“同一時(shí)間點(diǎn)”,而是多個(gè)任務(wù)或進(jìn)程共享一個(gè)CPU,并交由操作系統(tǒng)來完成多任務(wù)間對CPU的運(yùn)行切換,以使得每個(gè)任務(wù)都有機(jī)會(huì)獲得一定的時(shí)間片運(yùn)行。而現(xiàn)在多核CPU的情況下,同一時(shí)間點(diǎn)可以執(zhí)行多個(gè)任務(wù),具體到這個(gè)任務(wù)在CPU哪個(gè)核上運(yùn)行,這個(gè)就跟操作系統(tǒng)和CPU本身的設(shè)計(jì)相關(guān)了
2. node的缺點(diǎn):不擅長cpu密集型的操作
a. 什么是cpu密集型操作(復(fù)雜的運(yùn)算、圖片的操作)
// 這就是一個(gè)cpu密集型的操作
for (let i = 0; i < 100000000; i++) {
console.log(i);
}
b. nodejs為什么不擅長cpu密集型操作
因?yàn)閚odejs是單線程的,進(jìn)行密集型的運(yùn)算會(huì)導(dǎo)致主線程掛起
總結(jié)
以上是生活随笔為你收集整理的cpu多核 node 单线程_node单线程支撑高并发原理(node异步I/O)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序使用vant-dialog组件内容
- 下一篇: mysql时间戳在某天内_mysql根据