开始学node就了解到三大特点单线程,非阻塞I/O,事件驱动!
下面一个案例看一下非阻塞I/O处理机制,更好了解到node机制!其实三个特点就是一个事情,擅长I/O,擅长任务调度!
案例
//了解node的处理机制,擅长I/O,单线程高并发处理机制
const http=require("http");
const fs=require("fs");
// 产生一个5位随机数(用户id)
// console.log(1)
const server=http.createServer(function(req,res){
//禁用ico图标的请求
if(req.url=="/favicon.ico"){
return ;
}
res.writeHead(200,{"Content-Type":"text/plain;charset=utf8"})
var uid=parseInt(Math.random()*89999)+10000;
console.log("欢迎用户id:"+uid)
//异步读取文件
fs.readFile("./read.txt",{"charset":"utf8"},function(err,data){
if(err){
res.end("文件读取失败");
throw err;
}else{
console.log("用户id:"+uid+"读取文件完成");
// console.log(2)
res.end();
}
})
// console.log(3)
// res.end("中文");
})
server.listen(3001,"127.0.0.1");
查看一下console.log的运行顺序
发现结果并不是从上到下1,2,3执行!
原因剖析!
说过node的非阻塞I/O,正常运行,有新的并发过来,继续调度排队,调度完成后继续刚才的排队任务!
下面附上一张高并发的图
发现并不一个个人执行的工作完成后继续下一个,而是在同一时间进行任务调度,调度完成后,进行刚才排队序列继续执行!(善于调度,不善于计算),如果排序的是计算任务,则不能进行调度!