我已阅读有关Console对象和A note on process I/O的文档,但无法确定以下内容是否会导致同步或异步操作:
const out = fs.createWriteStream('./out.log')
const logger = new Console(out)
logger.log('foo')
我很好奇这是如何起作用的,特别是在* Nix系统上。但我不希望这种行为在Windows上有所不同。我问的原因是因为我已经构建了一个利用Console对象的记录器,但是在生产过程中将日志写入文件时我不希望记录器被阻塞。
答案 0 :(得分:4)
<强> tldr; 强>
根据Node的官方文档,您在这里所做的是同步,因为您使用的是文件。
写入可能是同步的,具体取决于流的内容 连接到系统是Windows还是Unix:
- 的文件强>: 在Windows和Linux上同步
- TTY(终端):异步打开 Windows,在Unix上同步
- 管道(和套接字):同步开启 Windows,在Unix上异步
警告:我强烈建议不要在生产服务上使用这些同步操作,因为同步写入会阻止事件循环,直到写入完成。在进行生产记录时,这可能是一个严重的缺点。
答案 1 :(得分:4)
异步。
内部Console
类维护一个回调_stdoutErrorHandler
,在写操作完成后触发并检查错误。我们可以用它来测试异步性。
const fs = require('fs');
const { Console } = require('console');
const str = new Array(100).fill('').map(() => 'o'.repeat(1000 * 1000)).join('');
const out = fs.createWriteStream('./o.txt');
const logger = new Console(out);
logger._stdoutErrorHandler = () => { console.log('written');};
logger.log(str);
console.log('hey');
你会看到'嘿'在'书面'之前打印出来。
The note on process I/O适用于process.stdin
和process.stdout
这些特殊流。当他们指向文件时,如下所示:
$ node someCode.js > file.txt
...在Unix中,Unix中的写操作将是同步的。这是在here行中处理的。在这种情况下,process.stdout
流将连接到文件而不是通常的unix文件描述符fd1
。