一尘不染

node.js的console.log是异步的吗?

node.js

console.log/debug/warn/error在node.js中-
异步?我的意思是javascript代码执行将停止,直到将东西打印在屏幕上,还是将在以后打印?

另外,我有兴趣知道console.log是否有可能在语句崩溃后立即不显示任何内容。


阅读 309

收藏
2020-07-07

共1个答案

一尘不染

更新: 从Node 0.6开始,此帖子已过时,因为stdout 现在是 同步的

好吧,让我们看看console.log实际是什么。

首先,它是控制台模块的一部分:

exports.log = function() {
  process.stdout.write(format.apply(this, arguments) + '\n');
};

因此,它只是进行一些格式化并写入process.stdout,到目前为止还没有异步。

process.stdout在启动时定义的吸气剂它是惰性初始化的,我添加了一些注释来解释事情:

.... code here...
process.__defineGetter__('stdout', function() {
  if (stdout) return stdout;                            // only initialize it once

  /// many requires here ...

  if (binding.isatty(fd)) {                             // a terminal? great!
    stdout = new tty.WriteStream(fd);
  } else if (binding.isStdoutBlocking()) {              // a file?
    stdout = new fs.WriteStream(null, {fd: fd});
  } else {
    stdout = new net.Stream(fd);                        // a stream? 
                                                        // For example: node foo.js > out.txt
    stdout.readable = false;
  }

  return stdout;
});

在使用TTY和UNIX的情况下,我们到这里结束,这件事是从套接字继承的。因此,节点基本上要做的就是将数据推送到套接字上,然后由终端负责其余的工作。

让我们测试一下!

var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
    data += data; // warning! gets very large, very quick
}

var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);

结果

....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms

real    0m0.969s
user    0m0.068s
sys  0m0.012s

终端需要大约1秒钟才能打印出套接字内容,而节点仅需要17毫秒即可将数据推送到终端。

流情况也是如此,文件情况也将异步处理。

因此, 是的, Node.js遵守其非阻塞承诺。

2020-07-07