如果将文件可写入stream传递给Node.js中的Console构造函数,是否正在向其写入asynchronous?
我已经阅读了有关Console对象的文档和有关进程I / O的说明 ,但是不知道以下内容是否会导致同步或asynchronous操作:
const out = fs.createWriteStream('./out.log') const logger = new Console(out) logger.log('foo')
我很好奇这是怎么回事,特别是在* Nix系统上。 但我不希望这在Windows上有不同的performance。 我所要问的原因是因为我已经构build了一个利用Console对象的logging器,但是我不希望logging器在生产中将日志写入文件时被阻塞。
它将是asynchronous的 。
内部Console
类维护一个callback_stdoutErrorHandler
触发写操作完成并检查错误。 我们可以使用它来testingasynchronous性。
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');
你会看到“嘿”在“书面”之前被打印出来。
关于进程I / O的注释适用于作为特殊stream的process.stdin
和process.stdout
。 当他们指向文件时,如下所示:
$ node someCode.js > file.txt
在Unix中,Unix中的写操作将是同步的。 这在这里按行处理。 在这种情况下, process.stdout
stream将连接到一个文件,而不是通常的Unix文件描述符fd1
。
tldr;
根据Node的官方文档,你在这里做的是同步的,因为你正在使用文件 。
写入可能是同步的,具体取决于stream连接的内容以及系统是Windows还是Unix:
- 文件 :在Windows和Linux上同步
- TTY(terminal) :在Windows上是asynchronous的,在Unix上是同步的
- pipe道(和套接字) :在Windows上同步,在Unix上是asynchronous的
警告 :强烈build议不要在生产服务上使用这些同步操作,因为同步写入会阻止事件循环,直到写入完成。 生产日志时,这可能是一个严重的缺陷。
参考: Node.js官方文档/有关进程I / O的注释