是node.js的console.logasynchronous?

在node.js中是console.log/debug/warn/error asynchrounous? 我的意思是将JavaScript代码执行停止,直到东西被打印在屏幕上,或将在稍后阶段打印?

此外,我有兴趣知道是否有可能为console.log不显示任何东西,如果立即语句后崩溃节点。

更新:从节点0.6开始,这个post已经过时,因为stdout现在是同步的

那么让我们来看看console.log实际上做了什么。

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

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

所以它只是做一些格式化和写入process.stdout ,到目前为止,没有任何asynchronous。

process.stdout是一个在启动时定义的getter ,它被懒惰的初始化,我添加了一些注释来解释事情:

 .... 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的情况下,我们最终在这里 ,这个东西从套接字inheritance。 所以这个节点的基本function就是将数据推送到套接字上,然后由terminal完成剩下的工作。

我们来testing一下吧!

 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 

terminal需要大约1秒才能打印出套接字内容,但节点只需要17毫秒将数据推送到terminal。

stream情况也是如此,并且文件事件也处理asynchronous 。

所以是的 Node.js坚持其非阻塞的承诺。

console.warn()和console.error()被阻塞。 在底层系统调用成功之前,它们不会返回。

是的,在写入标准输出的所有内容都被刷新之前,程序可能会退出。 process.exit()将立即终止节点,即使仍然有写入stdout的队列。 你应该使用console.warn来避免这种行为。

我的结论,阅读后Node.js 10. * docs(附下面)。 是你可以使用console.log进行日志logging, console.log是同步的,并在低级别c实现。 尽pipeconsole.log是同步的,但是只有在不logging大量数据的情况下才会导致性能问题。

(下面的命令行示例演示了console.log async和console.error是同步的

基于Node.js Doc的

控制台function在目的地是terminal或文件时是同步的(避免过早退出时丢失消息),并且当它是pipe道时(为避免长时间阻塞)而asynchronous。

也就是说,在下面的例子中,当stderr被阻塞时,stdout是非阻塞的:

$ node script.js 2> error.log | tee info.log

在日常使用中,除非您>logging海量数据,否则阻塞/非阻塞二分法不是您应该担心的事情。

希望它有帮助