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


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

3.事件驅動架構
代碼層面展示:
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');
/*結果
event1 fired
event_result
event2 fired
*/
4.nodejs單線程
運行js代碼的主線程是單線程(減少了多線程切換的cpu開銷與內(nèi)存開銷),但是在libuv庫中,使用到了node實現(xiàn)的線程池
缺點:處理cpu密集型的任務時,無法體現(xiàn)多核cpu的優(yōu)勢
代碼展示單線程處理cpu密集型任務時出現(xiàn)的阻塞現(xiàn)象:
const http = require('http');
function sleepTime(time){
const sleep = Date.now() + time * 1000;
// 同步代碼,等待時間
while(Date.now() < sleep){};
return;
}
sleepTime(4);
const server = http.createServer((req,res)=>{
res.end('server starting ...');
});
server.listen('8080',()=>{
console.log('服務啟動了');
})
5.nodejs應用場景


評論
圖片
表情
