nodejs異步IO
作者:小江不可求
來源:SegmentFault 思否社區(qū)
1.IO了解
IO分類(是否立即獲取到調(diào)用之后的結(jié)果):
阻塞IO:
重復(fù)調(diào)用IO操作,判斷IO是否結(jié)束(任務(wù)輪詢:read、select、poll、kqueue、event ports)因?yàn)樵谳喸兊倪^程中,程序再等待IO的結(jié)果,對(duì)于代碼而言,還是同步的效果。
文件IO: 放入到node實(shí)現(xiàn)的線程池中 異步網(wǎng)絡(luò)IO: 利用到了node的核心庫libuv庫 可判斷所運(yùn)行的平臺(tái) 根據(jù)平臺(tái)調(diào)用不同的異步IO處理的方法 (做到了類似于跨平臺(tái)的效果)


2.為什么要使用異步I/O

3.事件驅(qū)動(dòng)架構(gòu)
代碼層面展示:
const EventEmitter = require('events');
const emitter = new EventEmitter();
// 訂閱1
emitter.on('event',(result)=>{
console.log('event1 fired');
console.log(result);
})
// 訂閱2
emitter.on('event',(result)=>{
console.log('event2 fired');
})
// 發(fā)布
emitter.emit('event','event_result');
/*結(jié)果
event1 fired
event_result
event2 fired
*/
4.nodejs單線程
運(yùn)行js代碼的主線程是單線程(減少了多線程切換的cpu開銷與內(nèi)存開銷),但是在libuv庫中,使用到了node實(shí)現(xiàn)的線程池
缺點(diǎn):處理cpu密集型的任務(wù)時(shí),無法體現(xiàn)多核cpu的優(yōu)勢(shì)
代碼展示單線程處理cpu密集型任務(wù)時(shí)出現(xiàn)的阻塞現(xiàn)象:
const http = require('http');
function sleepTime(time){
const sleep = Date.now() + time * 1000;
// 同步代碼,等待時(shí)間
while(Date.now() < sleep){};
return;
}
sleepTime(4);
const server = http.createServer((req,res)=>{
res.end('server starting ...');
});
server.listen('8080',()=>{
console.log('服務(wù)啟動(dòng)了');
})
5.nodejs應(yīng)用場(chǎng)景


評(píng)論
圖片
表情
