搜索

首页  >  问答  >  正文

javascript - node.js中http.ServerResponse对象中的write方法为什么是同步的?

var http = require('http');
http.createServer(function(req,res){
    res.writeHeader(200, {'Content-Type' : 'text/html ; charset=utf-8'})
    if(req.url !== '/favicon.ico'){
        console.time('test');
        var c=1,a=2,b=3;        
        res.write(show()+''+c);
        c=a+b;
        res.write('<br />')
        res.write(c+'<br />');
        console.timeEnd('test');
        res.end()        
    }
}).listen(8000)
function show(){
    var str='';
    for(var i=0;i<10000;i++){
        str+=i*i*i*i+'<br />';
    }
    return str
}
console.log('server is running at http://127.0.0.1:8000')

最后两行是1和5!
书上写http.ServerResponse对象实现了一个 stream.Writable(可写流)。但是可写流一般是异步的(如fs写入流,zlib流,子进程的stdin)啊,这样对事件驱动的服务模型正好。现在我测试出的是res.write同步也就就是说要执行完这个回掉才能执行事件队列里的下一个回掉?
function(req,res)是ruquest事件的回掉,也就是说如果应对好几万个并发请求就要执行几万个function(req,res),哪怕function(req,res)里没有cpu密集应用积少成多这不是用户访问就会有延迟?但是node非常擅长处理密集io啊?是我想错了么?

这个show函数是我故意弄得,因为js是单线程不擅长处理cpu密集业务,所以res.write(show()+''+c)时间比较长这样比较好看res.write是不是异步,如果是res.write是异步那么就会先执行c=a+b;那c定是5;

给我你的怀抱给我你的怀抱2784 天前701

全部回复(3)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-05-31 10:40:35

    node 的优势是指,能处理高并发,是可以应付大量的请求,但是处理respone.write 或者 查询数据库的操作 是另外的线程处理的,就好像一个餐厅一样,有分厨师还有一个服务员(单线程),不像一般web服务框架只有一个厨师而且要兼职服务员,
    所以你上面的情况是不是密集的io,而像是,餐厅的厨师忙不过来处理你的菜,导致服务员上菜慢。

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-31 10:40:35

    很明显,执行show()时,还没有开始执行write(),所以你这个测试方法本身就不对。

    回复
    0
  • 滿天的星座

    滿天的星座2017-05-31 10:40:35

    write只是将数据写到内部的缓冲区就返回了,不是说把数据发送完成才返回,所以说几乎没有占用CPU时间

    回复
    0
  • 取消回复