Node.js-{Node.js}windows下的Node.js阻塞的问题
Node.js是单线程的,所以异步操作都是伪的吧,我猜想Node.js的原理可能是将每个异步操作放在一个队列上依次顺序执行。
这个代码实现如下功能:第一次请求使用setTimeout等待5秒后返回,第二次请求立即返回,照理说在第一次请求等待返回的时候发起第二次请求,该请求会立即返回,但实际测试下来,第二次请求必须等待第一次请求返回后才能返回,这是什么情况,难道是平台的关系?
var http = require('http');
var count=0;
http.createServer(function (request, response) {
if(count>0)
{
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('<b>Hello World</b>'+count);
count++;
}else{
setTimeout(function (){
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('<b>Hello World</b>'+count);
count++;
}, 5000);
}
}).listen(8888);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
修改过后的代码,注意count的计数位置:
var http = require('http');
var count=0;
http.createServer(function (request, response) {
if(count>0){
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('<b>Hello World</b>'+count);
}else{
setTimeout(function (){
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('<b>Hello World</b>'+count);
}, 5000);
}
count++;
}).listen(8888);
Nodejs是单线程,也就是说worker和listener是同一个,setTimeout阻塞时,当然也没无法同时去处理你后来的请求。这里核心的一点是处理过程无法异步,必须独立出去。
C世界中,一般下面几种:
1. 多进程模型:收到请求时fork一个进程去处理,或prefork出进程等待数据来处理,不阻塞主监听进程;
2. 多线程模型:类似于多进程,只不过fork过程换成了创建新线程的过程;
3. 线程池模型则优化了多线程的管理方法。
代码有问题否?
第一次请求,5秒后才修改count,如果5秒内发出第二次请求,还是执行else分支。