CNode

一个关于stream write的问题!

Lliangjun0305发布于13 年前最后回复13 年前6 回复4472 浏览0 收藏

代码如下: var net = require('net'); var conn = net.createConnection(6001, '127.0.0.1'); var str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

function cycle(){
  var result = conn.write(str);
  if(result == false){
      console.log(conn);
  }
}

for(var i = 1; i <= 500; i++){
   cycle();
}

上述伪码是一种业务场景。 看了一下node源代码,stream的writable.write会现将数据写入buffer,等待buffer超过限定值之后,在进行真正的写入。当buffer满了之后,这时候我代码中conn.write就会写入失败。node文档上说"Writes chunk to the stream. Returns true if the data has been flushed to the underlying resource. Returns false to indicate that the buffer is full, and the data will be sent out in the future",我的问题是,conn.write就会写入失败,数据在后面会发送,具体机制是怎么样的?然后这部分数据会存放在哪儿?

然后上面的场景使用多个连接不停的发送数据,会出现系统内存不停的增长,是和conn.write的机制有关系吗?

谢谢指教!!

查看回复

回复 (6)

L
liangjun0305#3·13 年前

编辑器不会用,上面的代码有点问题,分开的。我再贴一下试试:

var net = require('net');
var conn = net.createConnection(6001, '127.0.0.1');
var str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

function cycle(){
  var result = conn.write(str);
  if(result == false){
    console.log(conn);
  }
}

for(var i = 1; i <= 500; i++){
   cycle();
}
L
liangjun0305#4·13 年前

顶一下我的问题!!!

D
dengqiao#5·13 年前

发送数据太快了,内核都有发送缓冲区的,超过缓冲区大小的数据无法立即发送出去,这部分数据就是你要发的数据,所以你的node进程的内存会不断变大.

L
liangjun0305#6·13 年前
引用 dengqiao发送数据太快了,内核都有发送缓冲区的,超过缓冲区大小的数据无法立即发送出去,这部分数据就是你要发的数据,所以你的node进程的内存会不断变大.

请问这个缓冲区是内核开辟的还是node开辟呢?而且上述代码这样的发送应该不会超过内核的承载能力吧!

参与回复
登录后即可参与回复。登录