javascript - nodejs是如何处理监听的?
怪我咯
怪我咯 2017-04-11 11:39:24
[JavaScript讨论组]

如下面这段常见的代码:

var http =require('http');
http.createServer(function(req,res){
    //XXXX
    mycode here
}).listen(3000);

假如有很多请求同时到达,那么nodejs的单线程如何处理呢?是不是等前面那个请求处理完再接受下一个请求?看起来应该不是的,如果是这样,如果处理的逻辑复杂,就显得慢了。但如果在中间暂停而跑到前面去执行,不是可能产生数据冲突的问题吗?这类似java的线程安全一样。比如下面:

var http =require('http');
var myVar=1;
http.createServer(function(req,res){
    myVar=myVar+1;
            //XXXX
    mycode here;
    var k=myVar;
    if(k==myVar){
        XXXX;
        console.log('ok');
    }
}).listen(3000);
显然如果用刚刚的逻辑,那么有可能不输出OK来。
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
黄舟

nodejs对请求的处理当然是序列化的。所以它没有线程同步的问题。这样的原理表明,NODEJS不适合处理重CPU资源的工作。
这样的设计即有好处也有坏处,好处当然是处理能力大大提高(因为线程切换也要花很多时间的),另外编程难度也大大下降(我们再也不用考虑线程死锁、同步的问题了)。
坏处就是每个请求处理时间不能太长,否则可能会影响其它请求的处理,比如在请求处理中有如下代码,可能就会阻塞:

for(var i=0;i<100000;i++){
   console.log(rf.readFileSync("test","utf-8")); 
}

大多费时操作IO操作都需要回调函数处理。而费CPU的操作根本不可行。

迷茫

nodejs其实会调用libuv库开启一个新的线程来处理网络请求,处理完成以后将结果返回给主线程,主线程去执行回调函数。这也就是为何什么处理网络请求的其他任务不会被阻塞,因为它开启了一个新的线程,而在调用回调函数的时候回阻塞其他的回调函数,因为在主线程中运行回调函数。

所以计算密集型的任务不合适放在nodejs库里面运行,而io密集型任务会开启一个新的线程来处理,比较适合

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号