Node.js-{Node.js}windows下的Node.js阻塞的问题

发布于 2017-02-02 18:20:37 字数 789 浏览 1181 评论 3

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清晨说ぺ晚安 2017-11-03 17:41:39

修改过后的代码,注意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);

归属感 2017-06-14 11:04:46

Nodejs是单线程,也就是说worker和listener是同一个,setTimeout阻塞时,当然也没无法同时去处理你后来的请求。这里核心的一点是处理过程无法异步,必须独立出去。

C世界中,一般下面几种:
1. 多进程模型:收到请求时fork一个进程去处理,或prefork出进程等待数据来处理,不阻塞主监听进程;
2. 多线程模型:类似于多进程,只不过fork过程换成了创建新线程的过程;
3. 线程池模型则优化了多线程的管理方法。

偏爱自由 2017-04-14 01:44:27

代码有问题否?
第一次请求,5秒后才修改count,如果5秒内发出第二次请求,还是执行else分支。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文