gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:48:27 24 4
gpt4 key购买 nike

node.js 中的 console.log/debug/warn/error 是异步的吗?我的意思是 javascript 代码执行会停止,直到内容打印在屏幕上,还是会在稍后阶段打印?

另外,我很想知道如果该语句在 Node 崩溃后立即显示,console.log 是否有可能不显示任何内容。

最佳答案

更新:从 Node 0.6 开始,这篇文章已过时,因为 stdout 现在是同步了。

让我们看看 console.log 究竟做了什么。

首先它是 console module 的一部分:

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

所以它只是做一些格式化并写入 process.stdout,到目前为止还没有异步。

process.stdout 是一个 getter defined on startup这是延迟初始化的,我添加了一些注释来解释事情:

.... 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,我们最终会得到 here ,这个东西继承自socket。因此,该 Node 基本上所做的就是将数据推送到套接字,然后终端负责其余的工作。

让我们测试一下吧!

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

终端打印出sockets内容大约需要1秒,而node只需要17毫秒就可以将数据推送到终端。

流的情况也是如此,文件的情况也得到了句柄asynchronous .

所以是的 Node.js 忠实于它的非阻塞 promise 。

关于asynchronous - node.js 的 console.log 是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5127532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com